[Win 8 JS] Домашно Asynchronous Programming with WebWorkers


1

Source

Сложил съм една променлива _workerCount и по нея проверявам дали имам вече пуснати 3 workers или не.

Всеки метод в класа стартирва нов workers.

Ако има подобро решение ще се радвам някой да го сподели.

UPDATE:

Промених малко кода: worker-ите се инициализирват в конструктура, а не в методите. Направих CalculationHelper който държи методите за изчисляване и се инклудва в тях.




Отговори



0

Моето решение е доста подобно. Също така съм изнесъл работата с worker-a и проверката за броя на worker-ите в отделен метод, с което малко съкращавам copy-paste-a. 

Поствам само PrimeNumbersCalculator класа, тъй като worker-ите ми са като твоите.

http://pastebin.com/Peunt17y


от GeorgiYolovski (1147 точки)


2
И моето решение е подобно. Аз също като saykor се опитах да изкарам в отделен файл методите свързани с изчисляване на простите числа, но не ми се получи. saykor, виждам, че си използвал self.importScripts. Този метод от къде идва? При мен не го разпознава и ми чупи приложението.

от linach (717 точки)


0
Част от framework-a си е. Не съм правил аз нищо по-специално за да го ползвам. Виж дали имаш ///

от saykor (8845 точки)

0
Благодаря за отговора, но това ми добавя интелисенс, все още не ми намира функцията.За сега ще го оставя така и ако имам време ще търся проблема.

от linach (717 точки)



1

Source

На кратко: Инциализирам 3 worker-а в конструктора на класа ми гледам кой е свободен при заявка




0

Направих го да може да се въвежда желан брой worker-и в променлива в default.js . JS-a си генерира див-ове за резултата от всеки worker. Има клас workerController.js в който се пази масив от инициализирани работници. Класа връща индекс на свободния работник, брой на свободни работници и метод който приема параметри за интервал в който да търси простите числа. Всеки worker си има собствен div в който да постне резултатите когато са готови. Когато всички worker-и са заети, Submit-бутона става неактивен. Има и доста подробни коментари в кода ако на някой му е интересно.

Ето и линк към репо-то.


от m4r71n (0 точки)


1

Link: https://github.com/vlad0/TelerikAcademy/tree/master/WinJS/PrimeNumbersWinJSAsync

Аз също не можах да подкарам тази функция self.importScripts. Добре е с тези worker-и. Преди да се захвана с тях си ги представях малко по-различно - не подозирах, че за всеки "request" трябва да се създава worker. 

Тази проверка за трите работещи worker-и също ме изненада до известна степен. Защото ако един worker работи и ние цъкаме постояно Calculate бутона, всъщност заявките не/едит/ се нареждат на опашка при worker-а? Т.е. тази проверка за трите worker-a ми изглежда малко излишна. Или може би греша и заявките губят процесорно време и занимават worker-a с глупости. 

Грешката я показвам и след 3 секунди я скривам :)


от vlad0 (6103 точки)


0
Не съм сигурен че се нареждат на опашка. Струва ми се че се започва моментално работа по последната заявка. Можеш да си направиш един булев масив и там да гледаш (и сетваш) кой worker кога ти е свободен.

от m4r71n (0 точки)

0
нещо съм изпуснал НЕ-то sorry. Идеята ми беше, че пускам да ми намери до 111111, което отнема няколко секунди и продължавам да цъкам да ги изчислява и всъщност имам чувството, че си продължава работата по първата заявка, защото все едно е в busy mode а и времето за което обработва не се удължава.

от vlad0 (6103 точки)


1

Ето и моето решение. Като цяло в асинхронното програмиране няма нищо ниво. За генериране на прости числа съм имплементирал алгоритъм "Решето на Аткин", което е значително по-бързо от просто циклене и дори от "Решето на Ератостен". Може да се оптимизира още с "Wheel Factorization", но въпреки, че ми се искаше, нямах много време да го направя.

GitHub




0
Поздравления, че си си играл да правиш оптимизации, но на лекции (че и в домашните) нарочно ползваме бавния алгоритъм, та да можем да симулираме тежка и време отнемаща задача за worker-ите.


0
Знам, че това е идеята, но понякога от удоволствие и интерес се заигравам да оптимизирам някакви алгоритми, които по принцип им трябва време (като генериране на прости числа, смятане на факториел и подобни). При това е яко да видя, че на моя не особено велик лаптоп да се сметнат всички прости числа по малки от 20 000 000 (които са 1 270 607) за по-малко от минута и то три пъти. А ако е въпрос да върви достатъчно време, трябва му достатъчно голямо число :)