介绍
协程(Coroutine):被使用的方式类似于子程序的使用,但它可被中断转而执行另外一个子程序(类似于中断机制)。如主程序main
有子程序A
和B
。协程使得A
可被打断转而执行B
。A
、B
之间类似多线程(实际不是)并发的关系。
特点
- 极高的执行效率。因为协程之间更类似子程序之间的切换而不是线程切换,其是由程序自身控制的,因此,没有线程切换的开销。和多线程相比,线程数量多的情况下,协程的性能优势非常明显。
- 无多线程的锁机制。多协程并发运行,实际只有一个线程,不存在同时写变量的冲突,在协程中控制共享资源不加锁,只需要判断状态,其执行效率比多线程高很多。
asyncio模块
asyncio模块:一个对异步IO进行支持的库。
基本使用:将若干协程组成tasks,放到event_loop里面进行执行。这样便可将tasks里面的若干协程并发执行。
1 2 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()
|
1 2 3
| hello sang hello Lily hello wang
|
aiohttp模块
aiohttp模块:对异步执行HTTP请求提供支持的模块。
下面是异步HTTP请求的示例:
1 2 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模块:对文件的异步写入写出提供支持。
异步写出的协程定义示例如下:
1 2 3
| async def start(): async with aiofiles.open(url, mode='a', encoding='utf-8') as fp: await fp.write(feedback)
|