gevent 中写的很巧妙的地方分享

2016-04-07 22:38:27 +08:00
 boyhailong

看到源代码里在 recv 里有个 while 循环

def recv(self, *args):
        sock = self._sock  # keeping the reference so that fd is not closed during waiting
        while True:
            try:
                return sock.recv(*args)
            except error as ex:
                if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
                    raise
                # QQQ without clearing exc_info test__refcount.test_clean_exit fails
                sys.exc_clear()
            self._wait(self._read_event)

当前可读的话,直接返回数据;
如果不可读,调用_wait 将 sock 可读事件放进 loop 里等待 loop 检测可读事件,有可读事件时切换到当前协程,函数就开始执行
return sock.recv(*args)
理论上 while 循环最多被执行 2 次
刚开始看没怎么懂,协程的编程还是流弊,之前 C++用习惯了线程回调,还一时转换不过来。

2359 次点击
所在节点    Python
1 条回复
AZLisme
2016-04-10 11:43:17 +08:00
哈哈,还可以还可以。
我觉得就是充分利用了协程特性,是协程巧妙

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/269386

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX