Как завершить изоляцию и как получить уведомление, когда изоляция была прекращена

прекратить изолировать

Когда я хочу завершить изоляцию, запущенную на сервере, созданном с использованием Isolate.spawn() или Isolate.spawnUri()
, как я могу завершить изоляцию.

throw x внутри изолята завершает изоляцию, когда исключение не перехвачено.
Но я надеюсь, что есть более элегантное решение.

isolate.kill() бросает Uncaught Error: Unsupported operation: kill

получить уведомление

Я предполагаю, что когда асинхронные операции больше не активны, изоляция заканчивается (аналогично main), но как я могу узнать, действительно ли изоляция завершена?

Есть ли способ для родительского изолята получать уведомления о прекращении действия дочернего изолята? isolate.addOnExitListener(_sendPort); бросает Uncaught Error: Unsupported operation: addOnExitListener

?

Есть ли альтернативные способы или мне нужно подождать, пока эти методы не будут поддерживаться?


person Günter Zöchbauer    schedule 27.08.2014    source источник
comment
Чтобы уточнить, вы хотели бы, чтобы изолят А знал, закрылся ли изолятор Б? Кроме того, нам, вероятно, следует разделить это на два отдельных вопроса.   -  person Seth Ladd    schedule 28.08.2014
comment
Точно. Основной изолят A порождает новый изолят B. После того, как работа B завершена, она должна закончиться. A на самом деле не нуждается в уведомлении, это просто проверка того, что метод прекращения изоляции B действительно работает так, как ожидалось.   -  person Günter Zöchbauer    schedule 28.08.2014
comment
@GünterZöchbauer Вторая часть вопроса касается чего-то вроде Future<ExitCode> Isolate.terminate()? Я думаю, что если isolate не находится в неотвечающем состоянии, его не следует прерывать извне. В противном случае инкапсуляция нарушается, потому что ваш код работает исходя из предположения, что изолят B не имеет выделенных ресурсов (таких как соединения с БД, сокеты и т. д.), которые должны быть должным образом освобождены.   -  person JAre    schedule 28.08.2014
comment
@JAre Вы правы, конечно. Я попытался дочерним изолятом B отправить сообщение родительскому изоляту A, чтобы уведомить его о том, что B готов к уничтожению, но kill не поддерживается. Я не смог найти терминацию класса или экземпляра.   -  person Günter Zöchbauer    schedule 28.08.2014
comment
@GünterZöchbauer Dart стремится быть безопасным и простым в освоении, поэтому я не думаю, что стандартный API должен допускать неправильные методы кодирования. Но он может использовать некоторые сахарные методы, такие как Future isolate.killYourself(), которые будут выполнять предопределенный обратный вызов завершения внутри изолята B и возвращать Future в изоляте A. Если изолят B не имеет обратного вызова завершения, то Future должен содержать ошибку. Таким образом, пользователь сможет убить изолят, только если у него есть правильная механика.   -  person JAre    schedule 28.08.2014
comment
Я не хочу плохой практики кодирования. Я просто ищу правильный способ покончить с изоляцией. В настоящее время единственный способ, который я нашел, - это создать исключение. Я не думаю, что это очень элегантно (особенно трассировка стека, которую он выводит на консоль).   -  person Günter Zöchbauer    schedule 28.08.2014
comment
@GünterZöchbauer Я думал, что ReceivePort.close() прекратит изоляцию. stackoverflow.com/questions/ 24470247/   -  person JAre    schedule 28.08.2014
comment
Хм, я обнаружил, что изоляция не может завершиться, пока ReceivePort не закрыт, но это не обязательно означает, что закрытие ReceivePort завершает изоляцию. Это подводит нас ко второй части моего вопроса. Когда я попробую это предложение и закрою ReceivePort, как я могу убедиться, что это привело к прекращению изоляции?   -  person Günter Zöchbauer    schedule 28.08.2014
comment
@GünterZöchbauer Возможно, вы можете проверить количество потоков в процессе DartVM или потребление памяти.   -  person JAre    schedule 28.08.2014
comment
Я думал об этом, но потом подумал, что должен быть лучший способ, и я спросил на SO, чтобы посмотреть, не пропустил ли я что-то основное. Я буду исследовать это дальше, конечно.   -  person Günter Zöchbauer    schedule 28.08.2014
comment
Может быть, @lrn может помочь с этим.   -  person JAre    schedule 28.08.2014


Ответы (1)


из https://code.google.com/p/dart/issues/detail?id=10977#c2

Способ определить, что Isolate завершается после того, как он был успешно создан, заключается в использовании Isolate.addOnExitListener (возможно, также Isolate.addErrorListener, если нужно знать, почему он завершился). Запустите изоляцию с паузой, затем, когда Future of Isolate.spawnUri завершится, вы сможете настроить прослушиватели, а затем возобновить изоляцию.

Итак, у нас есть способ, он до сих пор не реализован в VM/Dartium, но это уже другой вопрос.

Смотрите также

person Günter Zöchbauer    schedule 06.10.2014