Skip to content
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

Concurrent async tasks on a single worker #371

Open
dko-slapdash opened this issue Jan 13, 2023 · 1 comment
Open

Concurrent async tasks on a single worker #371

dko-slapdash opened this issue Jan 13, 2023 · 1 comment

Comments

@dko-slapdash
Copy link

dko-slapdash commented Jan 13, 2023

Workerpool allows each thread to process only a single task at a time, which means that each task must be strictly CPU-bound, and any IO makes the pool work inefficiently.

At the same time, there are some traits of supporting multiple parallel tasks per threads in the code: https://github.com/josdejong/workerpool/blob/master/src/WorkerHandler.js#L332 - I think this is for the case when the thread is in "wait for ready" state only though, and due to this check: https://github.com/josdejong/workerpool/blob/master/src/Pool.js#L248 - it never schedules more than 1 task to a "busy" thread.

Piscina has a feature of scheduling multiple tasks to the same thread.

Are there any plans to implement the similar thing in workerpool (considering that the most of the infrastructure for this is already in the code)?

Repro of the serialization:

cat <<'EOT' > main.js
const workerpool = require("workerpool");
async function main() {
  const pool = workerpool.pool(`${__dirname}/worker.js`, { minWorkers: 1, maxWorkers: 1 });
  await Promise.all([
    pool.exec("test", [1]),
    pool.exec("test", [2]),
    pool.exec("test", [3]),
    pool.exec("test", [4])
  ]);
}
main();
EOT

cat <<'EOT' > worker.js
const workerpool = require("workerpool");
const delay = require("delay");
workerpool.worker({
  test: async (v) => {
    console.log(`[${v}] started`);
    await delay(1000);
    console.log(`[${v}] finished`);
  }
});
EOT

node main.js

[1] started
[1] finished
[2] started
[2] finished
[3] started
[3] finished
[4] started
[4] finished
@josdejong
Copy link
Owner

The library was originally intended for CPU heavy tasks, not for async tasks with IO.

It can be interesting to think though what is needed to add support for starting multiple async tasks with IO on the same worker. Anyone interested in picking this up?

@josdejong josdejong changed the title Concurrent (multiple) tasks per worker thread? Concurrent async tasks on a single worker? Jan 13, 2023
@josdejong josdejong changed the title Concurrent async tasks on a single worker? Concurrent async tasks on a single worker Jan 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants