Пикка: Как отменить очередь ожидающих сообщений актера, когда она была остановлена
Я играл с библиотекой актеров Pykka и нашел следующий потрясающий пример:
import pykka
from time import sleep
class TestActor(pykka.ThreadingActor):
def on_receive(self, message):
sleep(1)
print(message["v"])
a = TestActor.start()
for i in xrange(10):
print("asking for " + str(i))
a.tell({"v":i})
print(a.stop())
Я получаю ожидаемый результат: 10 запросов о строках, которые печатаются сразу, и еще 10 строк, напечатанных за 1 секунду:
asking for 0
asking for 1
asking for 2
asking for 3
asking for 4
asking for 5
asking for 6
asking for 7
asking for 8
asking for 9
0
1
2
3
4
5
6
7
8
9
True
После того, как все запросы были обработаны актером, True
печатается в результате stop
действие.
Интересно, можно ли было бы остановить актера, отменив таким образом прием и обработку повторных сообщений.
Я проверил документацию библиотеки, но все, что я могу найти, это block
Параметр stop, который означает совсем другое: когда установлено значение False
он делает вызов асинхронным, но его поведение в отношении очереди сообщений такое же:
останов (блок = Истина, тайм-аут = Нет)
Отправьте сообщение актеру с просьбой прекратить.
Возвращает True, если актер остановлен или был остановлен во время вызова. Неверно, если актер уже мертв. Если блок имеет значение False, он возвращает будущее, оборачивая результат.
Сообщения, отправленные актеру до того, как его попросят остановить, будут обрабатываться в обычном режиме до его остановки.
На сообщения, отправленные субъекту после того, как его попросят прекратить, ответят pykka.ActorDeadError после его остановки.
Актер не может быть перезапущен.
block и timeout работают как для ask().
Возвращает: pykka.Future или логический результат при блокировке
1 ответ
В настоящее время Pykka (1.2.0) не поддерживает прерывание очереди сообщений.
Источник: https://github.com/jodal/pykka/issues/46