gevent找到父greenlet

时间:2016-11-11 18:38:57

标签: python gevent greenlets call-hierarchy

有没有办法知道当前的greenlet是从gevent产生的greenlet?

  1. 我意识到产生当前greenlet的greenlet可能已经终止了,但在这种情况下我可以处理一个None作为答案。
  2. 我知道gevent.Greenlet.parent但这只代表集线器,而不是从当前greenlet开始的直接greenlet
  3. 我更喜欢不涉及猴子修补gevent.Greenlet
  4. 的解决方案

    我的用例是:我有一个服务器来处理执行python代码的请求(是的,是的,我知道它是不安全的:-)。每个请求都会生成一个处理请求的greenlet,包括将任何输入,输出或错误重定向到请求专用的通道。我希望能够同时处理请求,并且请求可能会自己生成greenlet。

    您可以找到我要做的事情here

    的示例

1 个答案:

答案 0 :(得分:0)

在原始greenlet包中,创建新的greenlet对象具有以下签名greenlet(run=None, parent=None)。因此,这意味着您可以提供parent参数或保留None,并且greenlet默认分配调用函数。

在这个软件包的顶部,gevent提供了工具和微小的事件循环来协调greenlet行为和lifecycle。因此,gevent.spawngevent.Greenlet创建的任何greenlet都会自动继承当前集线器(事件循环)作为父级。因此,每当一个greenlet完成其执行时,它就会将控制权转移回事件循环。根据文档:“这允许greenlet在产生控制权之前采取一些清理行动。”

但是,查看文档和Greenlet初始化的source code,我发现仍然可以通过提供新参数来覆盖构造函数。

from gevent.greenlet import Greenlet as GeventGreenlet


class Greenlet(GeventGreenlet):

    def __init__(self, caller=None, *args, **kwargs):
        super(Greenlet, self).__init__(*args, **kwargs)
        self._caller = caller

然后你需要告诉greenlet包尽可能早地使用你的Greenlet实现(类似于gevent monkeypatch)。

import gevent.greenlet
from myapp.greenlet import Greenlet

gevent.greenlet.Greenlet = Greenlet