Python学习---Python的异步IO[all]
![Python学习---Python的异步IO[all]_异步io](https://file.cfanz.cn/uploads/png/2022/02/21/6/dE24353N50.png) 
1.1.1. 前期环境准备和基础知识
安装:
pip3 install aiohttp![Python学习---Python的异步IO[all]_多线程_02](https://file.cfanz.cn/uploads/png/2022/02/21/6/4ee7O4A251.png) 
pip3 install grequests![Python学习---Python的异步IO[all]_python_03](https://file.cfanz.cn/uploads/png/2022/02/21/6/8Tf571b14M.png) 
pip3 install wheel![Python学习---Python的异步IO[all]_多线程_04](https://file.cfanz.cn/uploads/png/2022/02/21/6/fS1HUZc4b8.png) 
pip3 install scrapy![Python学习---Python的异步IO[all]_异步io_05](https://file.cfanz.cn/uploads/png/2022/02/21/6/41CY510E6T.png) 
注意:
windows上scrapy依赖 https://sourceforge.net/projects/pywin32/files/
安装Twisted
a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,
b. 下载:Twisted-17.1.0-cp35-cp35m-win_amd64.whl
![Python学习---Python的异步IO[all]_异步io_06](https://file.cfanz.cn/uploads/png/2022/02/21/6/b4570ZETV4.png) 
c. 进入文件所在目录
d. pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whl
![Python学习---Python的异步IO[all]_多线程_07](https://file.cfanz.cn/uploads/png/2022/02/21/6/212BHZb33S.png) 
实现IO操作的方式
为什么需要异步请求呢?
如果是正常的请求,一个请求结束后才能开启下一个请求[串行请求],如果期间有一个请求一次,则后面的请求都会终止。
如果是类似多线程的异步请求,则由多个线程同时开启多个请求,一个请求的异常不会影响其他
实现IO操作有3种方式:
同步 【串行操作】
多进程【更消耗资源,有操作系统调用】 --> 更适合计算密集型操作因为需要并发操作,消耗CPU
线程是计算机工作的最小单元
多线程【有CPU进行调用,节省资源】 --> 更适合多IO操作,因为发送请求后不消耗CPU资源
进程中至少有一个线程,默认都有一个主线程且共享进程的内部资源
多协程 --> 一个进程内一个线程完成多个任务【可以同时接收多个请求,然后在一个一个的处理请求】
如果遇到阻塞则执行下一个请求,如果阻塞的请求收到回复后执行刚才阻塞的那个请求【回调实现】,效率比多线程还高.
注:线程里面有GIL【global Interpreter lock】,Python里面有个GIL锁[该锁保障同时间1个进程内只允许1个线程操作],不允许CPU操作多个线程,不允许CPU调用资源[也就是限制了CPU,即限制了多线程]。但是线程可以进行IO操作,多个线程可以同时进行多个IO操作[URL 请求等,因为CPU的只需要发送一下即可,发送后不消耗cpu资源],
利用多线程实现IO的异步操作:
import requests
from concurrent.futures.thread import ThreadPoolExecutor
pool = ThreadPoolExecutor(5) # 创建线程池,也可以理解为多线程了这里
url_list = [
    'https://www.baidu.com/',
    'https://www.taobao.com/',
    'https://www.google.com/search',
    'https://hao.360.cn/',
]
def async_url(url):
    try:
        response = requests.get(url)
        print('正常请求:', '【', url, '】', response.content)
    except Exception as e:
        print('异常请求:', e)
for url in url_list:
    print('请求开始:', url)
    pool.submit(async_url, url)
pool.shutdown()   # 关闭线程后台显示结果:
![Python学习---Python的异步IO[all]_多线程_08](https://file.cfanz.cn/uploads/png/2022/02/21/6/647d0dDf54.png) 
利用多进程实现IO的异步操作:
[其他同上]
from concurrent.futures.process import ProcessPoolExecutor
import requests
pool = ProcessPoolExecutor(5) # 创建进程池,也可以理解为多线程了这里
pool.submit(async_url, url)   # async_url是个方法,url是传递过去参数
pool.shutdown()   # 关闭进程异步IO_1---asyncio模块(no-http)
Python学习---IO的异步[asyncio模块(no-http)]
异步IO_2---gevent+Grequests
Python学习---IO的异步[gevent+Grequests模块]
异步IO_3---twisted模块
Python学习---IO的异步[twisted模块]
异步IO_4---tornado模块
Python学习---IO的异步[tornado模块]
自定义异步IO
Python学习---IO的异步[自定义异步IO]
作者:小a玖拾柒
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!










