Сообщения, отправленные веб-работнику, все еще принимаются в том случае, если он занят? - PullRequest
1 голос
/ 09 июня 2019

У меня есть система, в которой я посылаю большой массив в рабочий, который затем использует библиотеку для его сжатия. Сжатие занимает много времени, а рабочий занят. Мне интересно, будут ли получены дальнейшие сообщения, отправленные работнику, пока он еще занят. Будут ли сообщения потеряны? Будут ли они поставлены в очередь и в конечном итоге обработаны рабочим?

1 Ответ

1 голос
/ 09 июня 2019

Да, как только рабочий завершит то, над чем он работает в данный момент, он сможет обработать следующее сообщение в очереди.Вот пример:

// https://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string
// I put in a Stack Snippet for live demonstration
// in a real project, put this in a separate file
const workerFn = () => {
  self.onmessage = () => {
    self.postMessage('Worker message callback just fired');
    // something expensive
    for (let i = 0; i < 2e9; i++) {
    
    }
    self.postMessage('Expensive operation ending');
  };
};
const workerFnStr = `(${workerFn})();`;
const blob = new Blob([workerFnStr], { type: 'text/javascript' });
const worker = new Worker(window.URL.createObjectURL(blob));

worker.onmessage = ({ data }) => console.log(data);

worker.postMessage(null);
worker.postMessage(null);

Это похоже на идею о том, что при нажатии на элемент в DOM этот щелчок будет обрабатываться после завершения текущей задачи цикла событий.даже если указанное задание дорого.

setTimeout(() => {
  window.onclick = () => console.log('click callback running');

  // something expensive
  for (let i = 0; i < 3e9; i++) {
  }

  console.log('Main synchronous task finishing');
}, 500);
Click here *quickly* after running the snippet
...