介绍

协程(Coroutine):被使用的方式类似于子程序的使用,但它可被中断转而执行另外一个子程序(类似于中断机制)。如主程序main有子程序AB。协程使得A可被打断转而执行BAB之间类似多线程(实际不是)并发的关系。

特点

  1. 极高的执行效率。因为协程之间更类似子程序之间的切换而不是线程切换,其是由程序自身控制的,因此,没有线程切换的开销。和多线程相比,线程数量多的情况下,协程的性能优势非常明显。
  2. 无多线程的锁机制。多协程并发运行,实际只有一个线程,不存在同时写变量的冲突,在协程中控制共享资源不加锁,只需要判断状态,其执行效率比多线程高很多。

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


# 0.定义协程
async def hello(name):
print("hello " + name)
await asyncio.sleep(1)# 协程中执行另外的协程需要加await


# 1.将协程封装入tasks
names = ['Lily', 'wang', 'sang']
tasks = []
for name in names:
tasks.append(hello(name))
# 2.获取事件循环对象
loop = asyncio.get_event_loop()
# 3.将tasks放入循环对象中进行执行
loop.run_until_complete(asyncio.wait(tasks))
# 4.关闭循环
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
# 1.定义协程
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"

# 2.用aiohttp模块进行异步HTTP请求操作
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)