gevent clean Greenlet exi公司

2024-06-16 12:42:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想听听其他人对我看到的一个问题的解决方案,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的原理背道而驰。在

我在任何地方都在寻找更好的解决方案,但一直没有运气。对于这类问题,一般的共识是什么?在


Tags: 代码信号状态方式timeoutgeventmsg解决方案
1条回答
网友
1楼 · 发布于 2024-06-16 12:42:37

更明智的解决方法是让每个greenlet处理自己的超时异常。绿色区域协调员不应该对绿色区域进行过多的干预。协调器应该做的是joinall,然后向greenlets请求结果或异常,这取决于它做一些后续操作。在

详细解释:

def my_greenlet():
    try:
       # do something here...
    except KindOfTimeOutException, e:
       raise e

greenlets协调员:

^{pr2}$

相关问题 更多 >