我想听听其他人对我看到的一个问题的解决方案,gevent用默认方式向greenlets发出退出状态的信号。在
我喜欢做群杀(timeout=3),但它在greenlet中的转换方式是GreenletExit的生成。这对于非常简单的本地计算代码来说是很好的,但是对于更复杂的代码,我发现它非常有限。下面是一个示例(使用ZMQ):
def myGreenlet( zFrom, zTo ):
msg = zFrom.recv_multipart()
zTo.send_multipart( msg )
我想告诉我的greenlet退出,但是如果GreenletExit正在接收/传输任何内容,则忽略GreenletExit。如果是这样的话,发送你收到的任何消息,然后再干净地退出。在
GreenletExit不过是中国商店里的一头公牛。因此,我提出的解决方案是,除了作为最后的手段之外,根本不使用该机制,而是通过以下事件手动处理向greenlet发出退出的信号:
^{pr2}$正如您将注意到的,除非我开始在所有IO调用中添加超时(如recv),并在.wait()中添加一个超时来减慢速度,这与gevent的原理背道而驰。在
我在任何地方都在寻找更好的解决方案,但一直没有运气。对于这类问题,一般的共识是什么?在
更明智的解决方法是让每个greenlet处理自己的超时异常。绿色区域协调员不应该对绿色区域进行过多的干预。协调器应该做的是
joinall
,然后向greenlets请求结果或异常,这取决于它做一些后续操作。在详细解释:
greenlets协调员:
^{pr2}$相关问题 更多 >
编程相关推荐