【发布时间】:2015-05-21 12:28:43
【问题描述】:
我想听听其他人对我看到的问题的解决方案,这是 gevent 用来向 greenlets 发出退出状态信号的默认方式。
我喜欢执行 group.kill(timeout = 3) 的能力,但它在 greenlet 中的翻译方式是生成 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 )
您会注意到,这也不是很好,除非我开始在所有 IO 调用中添加超时(如 recv)并在 .wait() 中添加超时以减慢它的速度,这违背了哲学事件。
我在任何地方都在寻找更好的解决方案,但没有成功。普遍的共识是什么,有什么方法可以很好地解决这类问题?
【问题讨论】:
-
显然对于第二个示例,我还可以在 zFrom 和 stopEvent 之间进行选择,但对于一个必须相当普遍的问题,它似乎仍然需要很多额外的代码。
-
我的回答对你有启发吗?如果是这样,请接受我的回答,这对我很重要。谢谢。