Как я могу получить доступ к возвращаемым данным из рабочего потока? - PullRequest
1 голос
/ 13 апреля 2020

Я скачал следующий пример, который показывает, как использовать рабочие потоки:

https://github.com/heroku-examples/node-workers-example.git

ПРИМЕЧАНИЕ. В этом примере требуется, чтобы Redis был установлен и работает

Я пытаюсь выяснить, как я могу получить доступ к данным, возвращаемым из рабочего потока?

Я добавил 'testData' JSON объект, который имеет дату начала и окончания и передал этот JSON объект в queue.add

// Kick off a new job by adding it to the work queue
app.post('/job', async (req, res) => {
  // This would be where you could pass arguments to the job
  // Ex: workQueue.add({ url: 'https://www.heroku.com' })
  // Docs: https://github.com/OptimalBits/bull/blob/develop/REFERENCE.md#queueadd

  var testData = {
    "dateStart": new Date(),
    "dateCompleted": null
  }

  console.log('testData start ' + testData.dateStart);

  let job = await workQueue.add( testData );
  res.json({ id: job.id });
});

Вот вывод из оператора log в вышеуказанной функции:

07:52:47 web.1      |  testData start Mon Apr 13 2020 07:52:47 GMT-0700 (Pacific Daylight Time)

Я изменил функцию workQueue.process, добавив дату окончания и выдав несколько операторов журнала:

  workQueue.process(maxJobsPerWorker, async (job) => {
    // This is an example job that just slowly reports on progress
    // while doing no work. Replace this with your own job logic.
    let progress = 0;

    console.log('Processing job', job.id,  job.data);

    // throw an error 5% of the time
    if (Math.random() < 0.05) {
      throw new Error("This job failed!")
    }

    while (progress < 100) {
      await sleep(50);
      progress += 1;
      job.progress(progress)
    }

    job.data.dateCompleted = new Date();
    console.log('ending job ' + JSON.stringify(job.data));

    // A job can return values that will be stored in Redis as JSON
    // This return value is unused in this demo application.
    return {r:job.data};
  });
}

Вот вывод журнала из вышеуказанной функции:

07:52:47 worker.1   |  Processing job 76 {
07:52:47 worker.1   |    dateStart: '2020-04-13T14:52:47.785Z',
07:52:47 worker.1   |    dateCompleted: null }
07:52:52 worker.1   |  ending job {"dateStart":"2020-04-13T14:52:47.785Z","dateCompleted":"2020-04-13T14:52:52.831Z"}

Теперь самое интересное, вот код, который ловит, когда рабочий поток завершается. Я только что добавил операторы журналирования

workQueue.on('global:completed', (jobId, result) => {

  console.log(`Job completed with result ${result}`);

  console.log('result ' + result );
  console.log('result.r ' + result.r );

  console.log('end ' + result.dateCompleted);
  console.log('beg ' + result.dateStart);
  //var diff = result.dateCompleted - result.dateStart;
  //console.log('duration ' + JSON.stringify( diff ));
});

Вот вывод:

07:52:52 web.1      |  Job completed with result {"r":{"cnt":100,"dateStart":"2020-04-13T14:52:47.785Z","dateCompleted":"2020-04-13T14:52:52.831Z"}}
07:52:52 web.1      |  result {"r":{"dateStart":"2020-04-13T14:52:47.785Z","dateCompleted":"2020-04-13T14:52:52.831Z"}}
07:52:52 web.1      |  result.r undefined
07:52:52 web.1      |  end undefined
07:52:52 web.1      |  beg undefined

Мне кажется, что данные задаются в рабочем потоке, и оператор журнала консоли «знает» об этом ... но я не понимаю, почему result.r не определено и почему я не могу получить доступ к значениям dateStart и dateCompleted?

ОБНОВЛЕНИЕ:

Добавлено следующее в мой код:

  var res = JSON.parse(result);
  console.log('res ' + JSON.stringify(res) );
  console.log('res.r.dateStart ' + res.r.dateStart );

Вот вывод:

08:52:34 web.1      |  res {"r":{"dateStart":"2020-04-13T15:52:29.272Z","dateCompleted":"2020-04-13T15:52:34.338Z"}}
08:52:34 web.1      |  res.r.dateStart 2020-04-13T15:55:11.965Z

1 Ответ

1 голос
/ 13 апреля 2020

Результат возвращается в виде строки. За мсбит мне нужно было добавить следующее:

var res = JSON.parse(result);

Тогда все работает как положено.

...