josdejong / workerpool

Offload tasks to a pool of workers on node.js and in the browser
Apache License 2.0
2.06k stars 147 forks source link

how to use workerEmit inside setInterval #397

Closed damartripamungkas closed 1 year ago

damartripamungkas commented 1 year ago

node version : v20.3.1 workerpool version : v6.4.2

question : how to make workerEmit emit a message every time with setInterval? code:

// my.js
const workerpool = require("workerpool");

function eventExample() {
    setInterval(() => {
        workerpool.workerEmit(`random number: ${Math.random()}`);
    }, 1000)
    return;
}

// create a worker and register functions
workerpool.worker({
    eventExample: eventExample,
});
// pool.js
const workerPool = require("workerpool");
const path = require("node:path");
const pool = workerPool.pool(path.join(__dirname, "my.js"));

pool.exec("eventExample", [], {
    on: console.log
})
josdejong commented 1 year ago

In your example, the method eventExample is executed and directly returns. Then the task and listeners are directly cleaned up. You have to return a promise to keep the method in an "executing" state. Something like this:

// my.js
const workerpool = require("workerpool");

function eventExample(delay) {
  return new Promise((resolve) => {
    let count = 0
    const interval = setInterval(() => {
      workerpool.workerEmit(`random number: ${Math.random()}`);
      count++
      if (count >= 10) {
        clearInterval(interval)
        resolve(42)
      }
    }, delay)
  });
}

// create a worker and register functions
workerpool.worker({
    eventExample
});
// pool.js
const workerPool = require("workerpool");
const path = require("node:path");
const pool = workerPool.pool(path.join(__dirname, "my.js"));

pool
    .exec('eventExample', [500], {
        on: console.log,
    })
    .then(result => {
        console.log('result is in:', result)
        return pool.terminate()
    })
damartripamungkas commented 1 year ago

i got u, thanks