当前位置:   article > 正文

理解python中async和await_async python

async python

参考大佬的文章

轻松理解 Python 中的 async await 概念_Likianta Me的博客-CSDN博客_python async前言写这篇文章是受 xinghun85 的这篇博客 的启发, 但是人家后面写的东西跳跃太快, 有点没看懂, 自己在此做一个补充.我希望能用一个最平易近人的例子, 把 Python 协程中的 async/await 概念讲清楚, 希望能够帮助大家有一个形象化的认识.注: 所有的讲解都在代码的注释里.from time import sleep, timedef demo1(): ...https://blog.csdn.net/Likianta/article/details/90123678

 一、为什么要用async

async用来在python中使用协程

  • Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程在执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码上了锁。所以,多线程在Python中只能交替执行,并不能做到真正的并发执行。
  • 所以在python中,通常使用协程来代替多线程。

二、使用方法

  1. def demo4():
  2. """
  3. 这是最终我们想要的实现.
  4. """
  5. import asyncio # 引入 asyncio 库
  6. async def washing1():
  7. await asyncio.sleep(3) # 使用 asyncio.sleep(), 它返回的是一个可等待的对象
  8. print('washer1 finished')
  9. async def washing2():
  10. await asyncio.sleep(2)
  11. print('washer2 finished')
  12. async def washing3():
  13. await asyncio.sleep(5)
  14. print('washer3 finished')
  15. """
  16. 事件循环机制分为以下几步骤:
  17. 1. 创建一个事件循环
  18. 2. 将异步函数加入事件队列
  19. 3. 执行事件队列, 直到最晚的一个事件被处理完毕后结束
  20. 4. 最后建议用 close() 方法关闭事件循环, 以彻底清理 loop 对象防止误用
  21. """
  22. # 1. 创建一个事件循环
  23. loop = asyncio.get_event_loop()
  24. # 2. 将异步函数加入事件队列
  25. tasks = [
  26. washing1(),
  27. washing2(),
  28. washing3(),
  29. ]
  30. # 3. 执行事件队列, 直到最晚的一个事件被处理完毕后结束
  31. loop.run_until_complete(asyncio.wait(tasks))
  32. """
  33. PS: 如果不满意想要 "多洗几遍", 可以多写几句:
  34. loop.run_until_complete(asyncio.wait(tasks))
  35. loop.run_until_complete(asyncio.wait(tasks))
  36. loop.run_until_complete(asyncio.wait(tasks))
  37. ...
  38. """
  39. # 4. 如果不再使用 loop, 建议养成良好关闭的习惯
  40. # (有点类似于文件读写结束时的 close() 操作)
  41. loop.close()
  42. """
  43. 最终的打印效果:
  44. washer2 finished
  45. washer1 finished
  46. washer3 finished
  47. elapsed time = 5.126561641693115
  48. (毕竟切换线程也要有点耗时的)
  49. 说句题外话, 我看有的博主的加入事件队列是这样写的:
  50. tasks = [
  51. loop.create_task(washing1()),
  52. loop.create_task(washing2()),
  53. loop.create_task(washing3()),
  54. ]
  55. 运行的效果是一样的, 暂不清楚为什么他们这样做.
  56. """
  57. if __name__ == '__main__':
  58. # 为验证是否真的缩短了时间, 我们计个时
  59. start = time()
  60. # demo1() # 需花费10秒
  61. # demo2() # 会报错: RuntimeWarning: coroutine ... was never awaited
  62. # demo3() # 会报错: RuntimeWarning: coroutine ... was never awaited
  63. demo4() # 需花费5秒多一点点
  64. end = time()
  65. print('elapsed time = ' + str(end - start))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/102502
推荐阅读
相关标签
  

闽ICP备14008679号