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

У меня есть следующий код веб-работника и обработчик onMessage, определенный следующим образом.

var worker = new Worker('worker.js');

worker.addEventListener('message', function(e){
  App.store.loadMany(App.Activity, e.data);
});

worker.postMessage(structure);

Весь мой код веб-воркера в worker.js вызывает обратный вызов onmessage и возвращает переданные объекты:

self.addEventListener('message', function(e){ 
  self.postMessage(e.data);
}, false);

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


person dagda1    schedule 08.06.2012    source источник
comment
Вы ничего не получаете таким образом, но да, это работает в другом потоке. Вы можете проверить это, написав бесконечный цикл в своем воркере и посмотреть, как родительский скрипт остается отзывчивым.   -  person Esailija    schedule 08.06.2012
comment
почему я ничего не получаю, если он работает в другом потоке? Я хотел, чтобы эта загрузка была отключена от потока пользовательского интерфейса.   -  person dagda1    schedule 08.06.2012
comment
Это фактическая загрузка выполняется в потоке пользовательского интерфейса? Я понимаю, что код в worker.js выполняется в другом потоке, но код обратного вызова будет выполняться в потоке пользовательского интерфейса?   -  person dagda1    schedule 08.06.2012
comment
какая загрузка? Вы просто отправляете сообщение, которое отправляется обратно. Только код, который находится внутри worker.js, выполняется в другом потоке. То есть последний фрагмент. Все остальные фрагменты выполняются в основном потоке. Что ты вообще грузишь? Он должен быть асинхронным.   -  person Esailija    schedule 08.06.2012
comment
Я загружаю объекты json в хранилище данных ember.   -  person dagda1    schedule 08.06.2012
comment
Как я мог сделать это асинхронно и спасибо за ответы, кстати.   -  person dagda1    schedule 08.06.2012
comment
Это зависит от того, что делает App.store.loadMany.   -  person Esailija    schedule 08.06.2012


Ответы (1)


Ваш Worker возвращает сообщение потоку GUI, который затем должен выполнить работу по вызову App.store.loadMany(). Так что никакой выгоды в этом случае нет.

Если вы измените свой основной поток графического интерфейса на:

var worker = new Worker('worker.js');
worker.postMessage(structure);

и ваш worker.js для:

self.addEventListener('message', function(e){
  App.store.loadMany(App.Activity, e.data);
  self.postMessage('done');
});

вы поместите работу App.store.loadMany() в поток Worker. Предполагается, что App.store.loadMany() можно запустить в Worker. Существуют некоторые ограничения на то, что может делать Worker.

Есть хорошее руководство здесь и здесь.

person pd40    schedule 08.06.2012
comment
Это моя проблема. Знаете ли вы, как сделать App.store доступным как в потоке пользовательского интерфейса, так и в рабочем потоке? На данный момент он создан как window.App. - person dagda1; 09.06.2012
comment
Вы можете попробовать передать App рабочему процессу в качестве параметра и посмотреть, работает ли он. Я предполагаю, что вы используете emberjs. это правильно? - person pd40; 09.06.2012