1. 获取协程任务中的函数返回值
import asyncio
import time
async def get_url(url):
print('start get url')
await asyncio.sleep(2)
print('end get url')
return 'result'
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
# 获取协程任务函数的返回值有两种方法
# 方法一, 使用asyncio中的ensure_future方法
task1 = asyncio.ensure_future(get_url('www.baidu.com'))
# 方法二, 使用loop对象的create_task方法
task2 = loop.create_task(get_url('www.baidu.com'))
# 以上两种方法的调用方式完全相同
loop.run_until_complete(task1)
loop.run_until_complete(task2)
end = time.time()
# 获取返回值调用task的result方法
print(task1.result())
print(task2.result())
运行结果
start get url
start get url
end get url
end get url
result
result
2.为协程任务添加不带参数的callback函数
import asyncio
import time
async def get_url(url):
print('start get url')
await asyncio.sleep(2)
print('end get url')
return 'result'
# callback函数可以不是协程函数,其必须有一个参数用来接收task任务
def callback(future):
print('callback')
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
task1 = asyncio.ensure_future(get_url('www.baidu.com'))
task2 = loop.create_task(get_url('www.baidu.com'))
# 通过调用add_done_callback方法传入callback函数执行
task1.add_done_callback(callback)
task2.add_done_callback(callback)
loop.run_until_complete(task1)
loop.run_until_complete(task2)
end = time.time()
# 获取返回值调用task的result方法
print(task1.result())
print(task2.result())
3.为协程任务添加带参数的callback函数
import asyncio
import time
from functools import partial
async def get_url(url):
print('start get url')
await asyncio.sleep(2)
print('end get url')
return 'result'
# callback函数可以不是协程函数,其必须有一个参数用来接收task任务
# 如果还需要传入其他参数那么必须将future参数放在最后一个
def callback(url, future):
print(url)
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
task1 = asyncio.ensure_future(get_url('www.baidu.com'))
task2 = loop.create_task(get_url('www.baidu.com'))
# 通过调用add_done_callback方法传入callback函数执行
# 使用functools中的partial方法将一个带参函数和其参数包装成一个新函数运行
task1.add_done_callback(partial(callback, 'www.baidu.com'))
task2.add_done_callback(partial(callback, 'www.baidu.com'))
loop.run_until_complete(task1)
loop.run_until_complete(task2)
end = time.time()
# 获取返回值调用task的result方法
print(task1.result())
print(task2.result())
运行结果
start get url
start get url
end get url
end get url
www.baidu.com
www.baidu.com
result
result
4.wait和gather的区别
import asyncio
import time
async def get_url(url):
print(url)
await asyncio.sleep(2)
return 'result'
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
task1 = [get_url('http://www.baidu.com') for i in range(10)]
# 使用wait方法会生成一个协程, 传入的参数是一个等待条件的完成
loop.run_until_complete(asyncio.wait(task1))
# 使用gather方法需要传入一个任务的分组, 需要在任务前面加上*
task2 = [get_url('http://www.baidu.com') for i in range(2)]
task3 = [get_url('http://www.baidu.com') for i in range(2)]
group2 = asyncio.gather(*task2)
group3 = asyncio.gather(*task3)
# 可以使用cancel方法取消任务
# group3.cancel()
# 使用gather方法需要传入一个任务的分组, 需要在任务前面加上*
loop.run_until_complete(asyncio.gather(group2, group3))
网友评论