有没有办法知道当前的greenlet是从gevent产生的greenlet?
我的用例是:我有一个服务器来处理执行python代码的请求(是的,是的,我知道它是不安全的:-)。每个请求都会生成一个处理请求的greenlet,包括将任何输入,输出或错误重定向到请求专用的通道。我希望能够同时处理请求,并且请求可能会自己生成greenlet。
您可以找到我要做的事情here
的示例答案 0 :(得分:0)
在原始greenlet
包中,创建新的greenlet对象具有以下签名greenlet(run=None, parent=None)
。因此,这意味着您可以提供parent
参数或保留None
,并且greenlet默认分配调用函数。
在这个软件包的顶部,gevent提供了工具和微小的事件循环来协调greenlet行为和lifecycle。因此,gevent.spawn
或gevent.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