asyncio: 并发编程

基础

同步(Sync) vs 异步(Asyncio)

所谓 Sync,是指操作一个接一个地执行,下一个操作必须等上一个操作完成后才能执行。
Async 是指不同操作间可以相互交替执行,如果其中的某个操作被 block 了,程序并不会等待,而是会找出可执行的操作继续执行。

并发 vs 并行

并发(concurrency)是指一次处理多件事,关于结构。并行(parallelism)是指一次做多件事,关于执行。并发用于定制方案,用来解决可能(但未必)并行的问题。
通俗理解,并行相当于多人同时去处理对应任务,彼此互不影响;

并发 vs 并行 场景

  • 并发通常应用于 I/O 操作频繁的场景,比如你要从网站上下载多个文件,I/O 操作的时间可能会比 CPU 运行处理的时间长得多。
  • 并行则更多应用于 CPU heavy 的场景,比如 MapReduce 中的并行计算,为了加快运行速度,一般会用多台机器、多个处理器来完成。

并发实现方式选择(多线程 OR 多协程)

选择

协程

触发机制

  1. asyncio.run() function to run the top-level entry point “main()” function #注意只能是top level,即不会有别的应用或函数调用asyncio.run
  2. await # 中断当前协程,触发await紧跟其后的协程调用,直到该协程结束,退回到当前协程,即await所在命令行继续往下执行
  3. The asyncio.create_task() function to run coroutines concurrently as asyncio Tasks.

Task(create_task)

Task 对象用于驱动协程,create_task后,这个协程会很快被自动调度执行。 Thread对象用于调用可调用的对象,需要手动执行$thread.start()

Exception

  1. 解释调度过程以及exception处理:https://python.plainenglish.io/how-to-manage-exceptions-when-waiting-on-multiple-asyncio-tasks-a5530ac10f02

语法基础

request

  • request.url,
  • request.query_string,
  • request.body
  • request.json
  • request.args,
  • request.raw_args,
  • request.query_args,

更多详情参考https://sanic.readthedocs.io/en/19.03.1/sanic/request_data.html

问题

  1. 一旦内部某个函数使用了async def, 导致后面每个调用者都需要await,所有模块都要定义成async,为了结束这种层级嵌套定义 可以使用
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
response = loop.run_until_complete(async_func)

参考资料

  1. https://cncws.github.io/fluent-python/concurrency-with-asyncio/
  2. https://time.geekbang.org/column/article/102562
  3. https://python.plainenglish.io/how-to-manage-exceptions-when-waiting-on-multiple-asyncio-tasks-a5530ac10f02
posted @ 2021-12-20 19:00  春树&暮云  阅读(51)  评论(0编辑  收藏  举报