asyncio: 并发编程
基础
同步(Sync) vs 异步(Asyncio)
所谓 Sync,是指操作一个接一个地执行,下一个操作必须等上一个操作完成后才能执行。
Async 是指不同操作间可以相互交替执行,如果其中的某个操作被 block 了,程序并不会等待,而是会找出可执行的操作继续执行。
并发 vs 并行
并发(concurrency)是指一次处理多件事,关于结构。并行(parallelism)是指一次做多件事,关于执行。并发用于定制方案,用来解决可能(但未必)并行的问题。
通俗理解,并行相当于多人同时去处理对应任务,彼此互不影响;
并发 vs 并行 场景
- 并发通常应用于 I/O 操作频繁的场景,比如你要从网站上下载多个文件,I/O 操作的时间可能会比 CPU 运行处理的时间长得多。
- 并行则更多应用于 CPU heavy 的场景,比如 MapReduce 中的并行计算,为了加快运行速度,一般会用多台机器、多个处理器来完成。
并发实现方式选择(多线程 OR 多协程)
协程
触发机制
- asyncio.run() function to run the top-level entry point “main()” function #注意只能是top level,即不会有别的应用或函数调用asyncio.run
- await # 中断当前协程,触发await紧跟其后的协程调用,直到该协程结束,退回到当前协程,即await所在命令行继续往下执行
- The asyncio.create_task() function to run coroutines concurrently as asyncio Tasks.
Task(create_task)
Task 对象用于驱动协程,create_task后,这个协程会很快被自动调度执行。 Thread对象用于调用可调用的对象,需要手动执行$thread.start()
Exception
- 解释调度过程以及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
问题
- 一旦内部某个函数使用了async def, 导致后面每个调用者都需要await,所有模块都要定义成async,为了结束这种层级嵌套定义 可以使用
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
response = loop.run_until_complete(async_func)