Многонишков ли е този код на уеб работник и печеля ли нещо

Имам следния код на уеб работник и манипулатора на 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
Не печелите нищо по този начин, но да, това се изпълнява в различна нишка. Можете да тествате това, като напишете безкраен цикъл във вашия worker и видите как родителският скрипт остава отзивчив   -  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
Как мога да направя това асинхронно и благодаря за отговорите BTW.   -  person dagda1    schedule 08.06.2012
comment
Зависи какво прави App.store.loadMany.   -  person Esailija    schedule 08.06.2012


Отговори (1)


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

Ако промените основната си GUI нишка на:

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. Има някои ограничения за това какво може да прави работник.

Има добър урок тук и тук.

person pd40    schedule 08.06.2012
comment
Това е проблемът, който имам. Знаете ли как да направите App.store достъпен както в нишката на потребителския интерфейс, така и в работния? В момента е създаден като window.App. - person dagda1; 09.06.2012
comment
Можете да опитате да предадете App на работника като параметър и да видите дали работи. Предполагам, че използвате emberjs. вярно ли е? - person pd40; 09.06.2012