python I/O 多路复用
Posted zzzzy09
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python I/O 多路复用相关的知识,希望对你有一定的参考价值。
总结:
1. socket默认是否是阻塞的?阻塞体现在哪里?
2. 如何让socket编程非阻塞?
client.setblocking(False) #非阻塞
3. IO多路复用作用?
检测多个socket是否发生变化。
操作系统检测socket是否发生变化,有三种模式:
select:最多1024个socket;循环去检测。
poll:不限制监听socket个数;循环去检测(水平触发)。
epoll:不限制监听socket个数;回调方式(边缘触发)。
Python模块:
select.select
select.epoll
4. 提高并发方案:
- 多进程
- 多线程
- 异步非阻塞模块(Twisted) scrapy框架(单线程完成并发)
5. 什么是异步非阻塞?
- 非阻塞,不等待。
比如创建socket对某个地址进行connect、获取接收数据recv时默认都会等待(连接成功或接收到数据),才执行后续操作。
如果设置setblocking(False),以上两个过程就不再等待,但是会报BlockingIOError的错误,只要捕获即可。
- 异步,通知,执行完成之后自动执行回调函数或自动执行某些操作(通知)。
比如做爬虫中向某个地址baidu.com发送请求,当请求执行完成之后自执行回调函数。
6. 什么是同步阻塞?
- 阻塞:等
- 同步:按照顺序逐步执行
以上是关于python I/O 多路复用的主要内容,如果未能解决你的问题,请参考以下文章
Python3标准库:selectors I/O多路复用抽象
11.python并发入门(part15 关于I/O多路复用)