美文网首页
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