这两天用到 gevent 写个服务器,对于 join 的印象还是停留在比较模糊的阶段,好像就这么用着用着也没事 贴一下 greenlet 中 join 的相关源码,感觉 gevent 中比较绕的就是这个 switch ,所有类的方法都叫一个 switch 这里是讲当前 greenlet 的回调用 rawlink 注册到一个双端链表,然后再切换到 hub ,我看说 join 是当所有 greenlet 都运行完毕之后再依次回调,这个回调具体是咋操作的,又是怎么回到 main 的呢 还请好心朋友赐教一下,一言千金
def join(self, timeout=None):
"""Wait until the greenlet finishes or *timeout* expires.
Return ``None`` regardless.
"""
if self.ready():
return
switch = getcurrent().switch
self.rawlink(switch)
try:
t = Timeout._start_new_or_dummy(timeout)
try:
result = self.parent.switch()
if result is not self:
raise InvalidSwitchError('Invalid switch into Greenlet.join(): %r' % (result, ))
finally:
t.cancel()
except Timeout as ex:
self.unlink(switch)
if ex is not t:
raise
except:
self.unlink(switch)
raise