VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > python教程 >
  • python基础教程之Python3标准库:asyncio异步I/O、事件循环和并发工具(3)

本站最新发布   Python从入门到精通|Python基础教程
试听地址  
https://www.xin3721.com/eschool/pythonxin3721/


asyncio.Future()
  •  
  • print('scheduling mark_done')
  • event_loop.call_soon(mark_done, all_done, 'the result')
  •  
  • print('entering event loop')
  • result = event_loop.run_until_complete(all_done)
  • print('returned result: {!r}'.format(result))
  • finally:
  • print('closing event loop')
  • event_loop.close()
  •  
  • print('future result: {!r}'.format(all_done.result()))
  • 调用set_result()时,Future的状态改为完成,Future实例会保留提供给方法的结果,以备以后获取。

    Future还可以结合await关键字使用。

    
    
    1. import asyncio
    2.  
    3. def mark_done(future, result):
    4. print('setting future result to {!r}'.format(result))
    5. future.set_result(result)
    6.  
    7. async def main(loop):
    8. all_done = asyncio.Future()
    9.  
    10. print('scheduling mark_done')
    11. loop.call_soon(mark_done, all_done, 'the result')
    12.  
    13. result = await all_done
    14. print('returned result: {!r}'.format(result))
    15.  
    16. event_loop = asyncio.get_event_loop()
    17. try:
    18. event_loop.run_until_complete(main(event_loop))
    19. finally:
    20. event_loop.close()

    Future的结果由await返回,所以经常会让同样的代码处理一个常规的协程和一个Future实例。

    1.4.2 Future回调

    除了做法与协程类似,Future完成时也可以调用回调。回调会按其注册的顺序调用。

    
    
    1. import asyncio
    2. import functools
    3.  
    4. def callback(future, n):
    5. print('{}: future done: {}'.format(n, future.result()))
    6.  
    7. async def register_callbacks(all_done):
    8. print('registering callbacks on future')
    9. all_done.add_done_callback(functools.partial(callback, n=1))
    10. all_done.add_done_callback(functools.partial(callback, n=2))
    11.  
    12. async def main(all_done):
    13. await register_callbacks(all_done)
    14. print('setting result of future')
    15. all_done.set_result('the result')
    16.  
    17. event_loop = asyncio.get_event_loop()
    18. try:
    19. all_done = asyncio.Future()
    20. event_loop.run_until_complete(main(all_done))
    21. finally:
    22. event_loop.close()

    这个回调只希望得到一个参数,即一个Future实例。要想为回调传递额外的参数,可以使用functools.partial()创建一个包装器。

    1.5 并发地执行任务

    任务是与事件循环交互的主要途径之一。任务可以包装协程,并跟踪协程何时完成。由于任务是Future的子类,所以其他协程可以等待任务,而且每个任务可以有一个结果,在它完成之后可以获取这个结果。

    1.5.1 启动一个任务

    要启动一个任务,可以使用create_task()创建一个Task实例。只要循环还在运行而且协程没有返回,create_task()得到的任务便会作为事件循环管理的并发操作的一部分运行。

    
    
    1. import asyncio
    2.  
    3. async def task_func():
    4. print('in task_func')
    5. return 'the result'
    6.  
    7. async def main(loop):
    8. print('creating task')
    9. task = loop.create_task(task_func())
    10. print('waiting for {!r}'.format(task))
    11. return_value = await task
    12. print('task completed {!r}'.format(task))
    13. print('return value: {!r}'.format(return_value))
    14.  
    15. event_loop = asyncio.get_event_loop()
    16. try:
    17. event_loop.run_until_complete(main(event_loop))
    18. finally:
    19. event_loop.close()

    这个例子中,在main()函数退出之前,会等待任务返回一个结果。

    1.5.2 取消一个任务

    通过保留create_task()返回的Task对象,可以在任务完成之前取消它的操作。

    
    
    1. import asyncio
    2.  
    3. async def task_func():
    4. print('in task_func')
    5. return 'the result
    相关教程