Я хотел бы услышать решение других людей о проблеме, которую я вижу по умолчанию, которую gevent использует, чтобы сигнализировать о выходе из состояния greenlets.gevent clean Выход Greenlet
Мне нравится возможность делать group.kill (timeout = 3), но способ, которым он переводится в зеленую оболочку, - это генерация GreenletExit. Это отлично подходит для очень простого кода локальных вычислений, но я считаю это очень ограниченным для чего-то более сложного. Вот пример (с использованием ZMQ):
def myGreenlet(zFrom, zTo):
msg = zFrom.recv_multipart()
zTo.send_multipart(msg)
Я хотел бы быть в состоянии сказать, мой greenlet, чтобы выйти, но игнорировать GreenletExit, если он находится в середине приема/передачи ничего. Если это так, отправьте сообщение, которое вы получили, и только потом выходите чисто.
GreenletExit - это просто бык в фарфоровом магазине. Таким образом, решение, которое я придумал, чтобы не использовать этот механизм вообще, кроме как последнее обращение, вместо этого я вручную обрабатывать сигнализацию на greenlet, чтобы выйти через событие, как это:
def myGreenlet(stopEvent, zFrom, zTo):
while not stopEvent.wait(0):
msg = zFrom.recv_multipart()
zTo.send_multipart(msg)
Как вам» Следует отметить, что это не очень хорошо, если я не начну добавлять таймауты во всех своих вызовах ввода-вывода (например, recv) и добавить тайм-аут в .wait(), чтобы замедлить его, что противоречит философии gevent.
Я искал лучшие решения, документально оформленные, но им не повезло. Каков общий консенсус, какие-либо хорошо поддерживаемые методы для такого рода проблем?
Очевидно, что для второго примера я мог бы также сделать выбор между zFrom и stopEvent, но она по-прежнему кажется, как много дополнительного кода для проблемы, которая должна быть довольно распространенной. – user3395838
Является ли мой ответ для вас источником вдохновения? Если да, примите мой ответ, это важно для меня. Спасибо. – liushuaikobe