在原始greenlet
包中,创建新的 greenlet 对象具有以下签名greenlet(run=None, parent=None)
。所以这意味着您可以提供parent
参数或保留它None
,而greenlet默认分配调用者函数。
在这个包之上,gevent 提供了工具和微小的事件循环来编排 greenlets 行为和生命周期。因此,任何由当前集线器(事件循环)创建gevent.spawn
或gevent.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