Написание WebWorker в Dart (без dart:isolate)

Я занимаюсь созданием веб-приложения, написанного на Dart, которое требует создания независимых путей выполнения, также написанных на Dart. (Если бы мы не работали в браузере, я бы назвал их «потоками».)

Обычно я бы использовал изоляты Dart (очень надежные) для выполнения этой задачи, но я ограничен тем, что мне нужно иметь возможность произвольно завершить любой из этих «потоков» в любое время без их сотрудничества.

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

Насколько я понимаю, с помощью dart:isolate это невозможно. (Правильно?)

Во всяком случае, мне удалось скомпилировать некоторый код Dart в Javascript с помощью dart2js и выполнить его в Worker, но я не знаю, как правильно вызвать функцию postMessage и ответить на событие onmessage, как в JS. Я немного возился с внутренностями dart2js и сумел настроить его (в частности, материал js_backend), чтобы я мог выполнять функцию postMessage из своего кода, но отвечать на событие onmessage с помощью обработчика Dart я не понимаю. работы dart2js.

Я просмотрел библиотеку js.dart, но она работает путем создания тегов script на странице, а это, очевидно, невозможно в воркере.

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


person Zane Kaminski    schedule 13.09.2013    source источник
comment
Я могу ошибаться, но разве это вообще невозможно с помощью WebWorker?   -  person MarioP    schedule 20.09.2013
comment
Я также хотел бы иметь возможность удалять изоляты Dart из основного корневого изолята. И/или иметь возможность создавать веб-воркеров и убивать их из корневого изолята. Предыстория: я пишу игру, и я хотел бы иметь возможность запускать написанный пользователем искусственный интеллект в отдельных изолятах, и если ИИ глючит, его следует убить, а не ИИ убивает браузер.   -  person KajMagnus    schedule 20.09.2013
comment
@MarioP следующие документы создают у меня впечатление, что рабочих действительно можно убить: w3 .org/TR/workers/#kill-a-worker Пользовательские агенты могут вызывать модель обработки kill a worker для worker в любое время, например в ответ на запросы пользователей   -  person KajMagnus    schedule 20.09.2013
comment
Я знаю, что могу убить рабочего. Реальный вопрос заключается в том, как я могу вызвать postMessage и ответить на событие onmessage в Dart.   -  person Zane Kaminski    schedule 21.09.2013


Ответы (1)


Класс Worker, кажется, поддерживает то, что вы хотеть.

  • Вы можете использовать postMessage для отправки сообщения к нему
  • Вы можете подписаться на onMessage, чтобы получать сообщения
  • Вы можете использовать terminate для завершения Это
person Danny Tuppeny    schedule 14.09.2014