-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Some nice way of async iterating? #37
Comments
What I have been doing is something like this: await Promise.all(files.map(async (file) => {
await sema.acquire();
try {
await upload(file);
} finally {
sema.release();
}
})); |
@wmertens Actually, for your particular problem, you should look at this module instead: https://github.com/sindresorhus/p-queue p-queue has some queue-based operations, event-emitters, and start/pause functionality. async-sema has its uses of course, for e.g. if we are concerned about rate limiting. |
@OlliV That's nice too, with the difference that you create all the promises at once. So for <1000 items that's easier to reason about, but beyond that I'm worried about memory consumption. @cardin hmmm p-queue seems to only work by adding functions to a queue, not by passing an array and having it be processed. So it doesn't help in this case, or am I mistaken? |
@wmertens The example code that OlliV gave shouldn't run into memory issues, since even 10,000 pending promises shouldn't be too much of an issue if they're not allowed to start.
|
@cardin but in both cases it does use O(n) memory, and at some point that becomes too much. Processing an array with "workers" uses only O(nWorkers) memory. V8 is pretty efficient, but if small changes (amount of code is similar) can use less memory, that's a good thing, right? Less memory trashing => less GC => faster, even apart from host constraints |
@wmertens oh right. I have seen that happening (OOM). I have used array-split for splitting a long array and processing it in chunks. Maybe I could add it to the examples. |
I'm trying to limit uploads to 10 simultaneously, and I'm doing it like this:
It's reasonably nice, but I was wondering if there wasn't a way to make this nicer.
I moved the logic to this helper function
Is this a good way of going about it? Is there maybe a more elegant way?
(wrote these tests too)
The text was updated successfully, but these errors were encountered: