Я экспериментирую с веб-работниками, и мне было интересно, насколько хорошо они справятся с смущающе параллельными проблемами. Поэтому я реализовал игру Коннавей . (Чтобы было немного веселее, чем делать размытие, или что-то в этом случае. Однако проблемы были бы такими же.)
В настоящее время у меня есть один веб-работник, выполняющий итерации и отправляющий обратно новые ImageData для потока пользовательского интерфейса, чтобы разместить его на холсте. Работает красиво.
Однако мой эксперимент на этом не заканчивается, потому что у меня есть несколько доступных процессоров и я хочу распараллелить приложение.
Итак, для начала я просто разделил свои данные на две части, посередине, и сделал двух рабочих, каждый из которых имеет половину каждого. Проблема, конечно, раскол. Работнику A требуется один столбец пикселей от работника B и наоборот. Теперь я могу четко это исправить, разрешив моему UI-потоку передавать этот столбец рабочим, но было бы намного лучше, если бы мои потоки могли напрямую передавать их друг другу.
При дальнейшем разделении каждый работник должен будет отслеживать только своих соседей, а поток пользовательского интерфейса будет отвечать только за обновление пользовательского интерфейса (как и должно быть).
Моя проблема в том, что я не понимаю, как мне добиться этого общения между работниками. Я попытался передать соседям друг друга посредством postMessage инициализации, но это скопировало бы моего работника, а не передавало ссылку, которая, к счастью, Chrome предупредила меня о невозможности.
Uncaught Error: DATA_CLONE_ERR: DOM Exception 25
Наконец я вижу, что есть нечто, называемое SharedWorker
. Это то, что я должен изучить, или есть способ использовать Worker
, который решит мою проблему?