参考文章
- Python黑魔法 --- 异步IO( asyncio) 协程
- 参考文章1深入浅出地介绍了协程及其相关概念(loop事件循环, task任务, future结果对象), 层层递进, 容易理解. 相对于
廖雪峰
老师对async/await
的两篇介绍文章, 更加系统, 且条理更加分明. 只不过偏了一点, 并不完全适用我们echo server
的使用场景. 但是入门的非常棒.
- 参考文章1深入浅出地介绍了协程及其相关概念(loop事件循环, task任务, future结果对象), 层层递进, 容易理解. 相对于
- 从 asyncio 简单实现看异步是如何工作的
- 比较符合我们的项目, 尤其是对于
echo server
的协程模型, 提供了较为底层的代码, 而不是像网上大部分示例中使用start_server
,reader
,writer
, 或是asyncio.Procotol
这种更高级的工具.
- 比较符合我们的项目, 尤其是对于
- Low-level socket operations
server端async_server.py
使用了asyncio
自带的底层封装sock_accept
, sock_recv
和sock_send
, 需要python3.5+.
[root@efd527db107f ~]# python server.py
开始监听...
收到来自 127.0.0.1:59148 的连接
get
收到来自 127.0.0.1:59150 的连接
get
client
没什么较大的变化, 额外又写了一个async_client.py
客户端(...好像没什么用)
除了python3中取消了
raw_input()
函数, byte str与普通str分成了两个不同的类型, 在recv
与send
前后需要调用encode()
或decode()
进行转换.
要使用sock_accept
这些asyncio
内置的异步函数, 需要设置setblocking(False)
. 否则只有第一个客户端能与服务端进行通信, 在这个连接断开之前, 之后的客户端能与服务端建立连接但无法发送信息, 会一直阻塞.
async_server.py.1
和async_server.py.2
是我尝试不使用asyncio
内置函数sock_accept
这些, 而是自定义接收与发送协程的示例代码, 不过可惜运行不成功.
async_server.py.1
甚至不能与客户端建立连接, 改用sock_accept
后, 能与第一个接入的客户端进行正常通信, 但是之后的客户端还是会被阻塞.
个人感觉异步编程精髓在于异步处理流程以及如何定义协程函数, 但是asyncio
的封装太强, 对更深入理解协程没有太大帮助.