美文网首页
python asyncio并发编程(2)

python asyncio并发编程(2)

作者: TheRightPath1 | 来源:发表于2020-01-07 16:19 被阅读0次

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))

相关文章

网友评论

      本文标题:python asyncio并发编程(2)

      本文链接:https://www.haomeiwen.com/subject/uywractx.html