gevent find parent greenlet



是否有一种方法可以知道当前的greenlet是从事件中生成的?

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

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

你可以在这里找到我要做的事情的例子

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

在这个包之上,gevent提供了工具和小事件循环来协调greenlet的行为和生命周期。因此,由gevent.spawngevent.Greenlet创建的任何greenlet都会自动继承当前的hub(事件循环)作为父节点。因此,每次当一个greenlet完成其执行时,它都会将控制转移回事件循环。根据文档:"这允许greenlet在放弃控制权之前进行一些清理操作。"

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

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

相关内容

  • 没有找到相关文章

最新更新