介绍
协程(Coroutine):被使用的方式类似于子程序的使用,但它可被中断转而执行另外一个子程序(类似于中断机制)。如主程序main有子程序A和B。协程使得A可被打断转而执行B。A、B之间类似多线程(实际不是)并发的关系。
特点
- 极高的执行效率。因为协程之间更类似子程序之间的切换而不是线程切换,其是由程序自身控制的,因此,没有线程切换的开销。和多线程相比,线程数量多的情况下,协程的性能优势非常明显。
- 无多线程的锁机制。多协程并发运行,实际只有一个线程,不存在同时写变量的冲突,在协程中控制共享资源不加锁,只需要判断状态,其执行效率比多线程高很多。
asyncio模块
asyncio模块:一个对异步IO进行支持的库。
基本使用:将若干协程组成tasks,放到event_loop里面进行执行。这样便可将tasks里面的若干协程并发执行。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | import asyncio
 
 
 async def hello(name):
 print("hello " + name)
 await asyncio.sleep(1)
 
 
 
 names = ['Lily', 'wang', 'sang']
 tasks = []
 for name in names:
 tasks.append(hello(name))
 
 loop = asyncio.get_event_loop()
 
 loop.run_until_complete(asyncio.wait(tasks))
 
 loop.close()
 
 
 | 
| 12
 3
 
 | hello sanghello Lily
 hello wang
 
 | 
aiohttp模块
aiohttp模块:对异步执行HTTP请求提供支持的模块。
下面是异步HTTP请求的示例:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | async def start():
 headers = {
 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42"
 }
 proxy =  "http://5.5.5.5:15888"
 
 
 async with aiohttp.ClientSession() as session:
 url = "http://www.baidu.com"
 async with await session.get(url, headers=headers, proxy=, timeout=30) as response:
 page_text = await response.text()
 
 | 
aiofiles模块
aiofiles模块:对文件的异步写入写出提供支持。
异步写出的协程定义示例如下:
| 12
 3
 
 | async def start():async with aiofiles.open(url, mode='a', encoding='utf-8') as fp:
 await fp.write(feedback)
 
 |