在Windows下使用asyncio模块(事件循环用的是默认的_WindowsSelectorEventLoop
)
探究其BaseEventLoop.create_connection
的调用层次,发现其中还同步调用了connect和select函数。
首先,调用层次如下:
BaseEventLoop.create_connection
BaseSelectorEventLoop.sock_connect
BaseSelectorEventLoop._sock_connect
socket.connect
然后参考socket.connect的实现,发现其中调用了connect后,还调用了select。
问题是,本来在程序等待三次握手的时候,Python可以把执行别的协程的,但是这样同步的调用,使得Python只能等待三次握手了。
这样会造成性能问题吗?
如果在异步上下文中调用了阻塞函数,确实会造成性能问题。不过呢,这里的
socket.connect
是非阻塞的,所以不会有性能问题。见asyncio/base_events.py
393 行:这里设置了 socket 对象为非阻塞的,所以你看到的下面这些代码都会立即返回:
——即使三次握手还没有完成。异步等待握手完成的代码见
asyncio/selector_events.py
的 308 行: