这两天用到 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.