看到源代码里在 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++用习惯了线程回调,还一时转换不过来。
1
AZLisme 2016-04-10 11:43:17 +08:00
哈哈,还可以还可以。
我觉得就是充分利用了协程特性,是协程巧妙 |