【python学习】Python协程

协程,又称微线程,纤程。英文名Coroutine。

1
2
3
4
5
6
7
8
9
def A():
print '1'
print '2'
print '3'

def B():
print 'x'
print 'y'
print 'z'

假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是:

1
2
3
4
5
6
1
2
x
y
3
z

python 3协程

1
2
3
4
5
6
7
8
9
10
11
12
# 导入协程模块
import asyncio
# 创建由async修饰的函数
async def request(url):
print("正在请求的url是", url)
print("请求成功", url)
# async修饰的函数调用之后返回一个协程对象
c = request("www.baidu.com")
# 创建一个事件循环对象
loop = asyncio.get_event_loop()
# 将协程对象注册到loop中,然后启动loop
loop.run_until_complete(c)

显示结果:

1
2
正在请求的url是 www.baidu.com
请求成功 www.baidu.com

协程task使用

1
2
3
4
5
6
# task的使用
loop = asyncio.get_event_loop()
# 基于loop创建一个task对象
task = loop.create_task(c)
print(task)
loop.run_until_complete(c)

协程future

1
2
3
4
5
6
# future的使用
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(c)
print(task)
loop.run_until_complete(task)
print(task)

使用回调

1
2
3
4
5
6
7
8
9
10
11
# 设置回调函数
def callback_func(task):
print(task.result())


# 绑定回调
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(c)
# 将回调函数绑定到任务对象中
task.add_done_callback(callback_func)
loop.run_until_complete(task)
1
2
3
正在请求的url是 www.baidu.com
请求成功 www.baidu.com
www.baidu.com

多任务异步协程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import asyncio
import time


async def request(url):
print("正在下载", url)
# 在异步协程中出现了同步模块中的代码,那就无法实现异步
# time.sleep(2)
# 当在asyncio中阻塞操作必须进行手动挂起
await asyncio.sleep(2)
print(url, "下载完毕")


urls = [
'www.baidu.com',
'www.sogou.com',
'www.douban.com'
]
stasks = []
for url in urls:
c = request(url)
task = asyncio.ensure_future(c)
stasks.append(task)
start = time.time()
loop = asyncio.get_event_loop()
# 需要将任务列表封装到wait中,再传入其中
loop.run_until_complete(asyncio.wait(stasks))
print(time.time() - start)