0

有没有办法知道当前的greenlet是从哪个greenlet生成的?

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

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

你可以在这里找到我想要做的一个例子

4

1 回答 1

0

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

在这个包之上,gevent 提供了工具和微小的事件循环来编排 greenlets 行为和生命周期。因此,任何由当前集线器(事件循环)创建gevent.spawngevent.Greenlet自动继承的 greenlet 作为父级。所以每次当一个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
于 2016-11-13T06:01:41.240 回答