Как предотвратить блокировку веб-работников HTML5, чтобы они правильно отвечали на сообщения от родителей - PullRequest
8 голосов
/ 05 июля 2010

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

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

Очевидные варианты - использовать таймер (скажем, с setInterval), однако я прочитал, что минимальная задержка между срабатываниями довольно велика (http://ajaxian.com/archives/settimeout-delay), что, к сожалению, сильно замедляет обработку).

Что думают по этому поводу другие люди? Я попытаюсь отправить работнику onmessage себе в конце каждого onmessage, таким образом, эффективно реализуя один шаг цикла обработки для каждого полученного события.от самого себя, но просто хотел посмотреть, есть ли у кого-нибудь какие-нибудь идеи по этому поводу.

Спасибо,

Ответы [ 3 ]

6 голосов
/ 05 июля 2010

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

- Ник

4 голосов
/ 19 мая 2012

Я столкнулся с этой проблемой сам, когда впервые играл с рабочими.Я также обсуждал использование setInterval, но чувствовал, что это будет довольно хакерский подход к проблеме (и я уже пошел по этому пути для своей эмулированной многопоточности).Вместо этого я остановился на работниках из основного потока (worker.terminate ()) и воссоздал их, если задача, в которую они вовлечены, должна быть прервана.Сборка мусора и т. Д., Казалось, была обработана в моем тестировании.

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

Нерестовые субработники в любом случае могут привести к тому же набору проблем;вам все равно придется прекратить работу вспомогательных работников (или создать новых) в соответствии с некоторой логикой, и я не уверен, что она также поддерживается (например, в chrome).

Джеймс

0 голосов
/ 02 октября 2010

Имея ту же проблему, я искал черновик веб-работников и нашел что-то в разделе Модель обработки , шаги с 9 по 12. Насколько я понял, работник, который начинает обрабатывать задачу, не будетобрабатывать еще один, пока первый не будет завершен.Так что, если вам не нужно останавливать и возобновлять выполнение задачи, ответ nciagra должен дать лучшие результаты, чем перепланирование каждой итерации задачи.

Тем не менее, все еще ведется исследование.

...