IO多路复用
IO多路复用作用:检测多个socket是否已经发生变化(是否已经连接成功,是否已经获取数据(是否可读可写))
基于IO多路复用+socket实现并发请求(一个线程100个请求)
IO多路复用
socket非阻塞 client.setblocking(False)
Twisted:python中开源的 基于事件循环实现的异步非阻塞框架
非阻塞:不等待
异步:执行完某个任务后自动调用我给他的函数
操作系统检测socket是否发生变化,有三种模式:
select:最多1024个socket;循环去检测
poll:不限制监听socket个数;循环去检测(水平触发)
epoll:不限制监听socket个数;回调方式(边缘触发)
python模块:
select.select
提高并发方案:
多进程
多线程
异步非阻塞模块(Twisted) scrapy框架(单线程完成并发)
协程 微线程,对一个线程进行分片,使线程在代码块之间来回切换执行. greenlet 人为代码切换
安装 pip3 install greenlet
import greenlet
def f1():
print(11)
gr2.switch()
print(22)
gr2.switch()
def f2():
print(33)
gr1.switch()
print(44)
gr1 = greenlet.greenlet(f1)
gr2 = greenlet.greenlet(f2)
gr1.switch()
遇到IO就切换 gevent模块 greenlet+IO 切换
安装 pip3 install gevent
示例
from gevent import monkey
import gevent
import requests
monkey.patch_all() # 以后代码中遇到IO都会自动执行greenlet的 switch()
def get_page(url):
ret = requests.get(url)
print(ret.content.decode(‘utf-8’))
gevent.joinall([
gevent.spawn(get_page, ‘http://www.baidu.com’),
gevent.spawn(get_page, ‘http://www.github.com’)
])