30 November 2019
Python3 Concurrency
by xiangxiang
如何使用python3的并发
0x00 Overview
Type |
Switching Decision |
Processors |
python3 module |
When to Use |
multithreading |
Operation system |
1 |
threading |
I/O-bound |
multiprocessing |
Operation system |
many |
multiprocessing |
CPU-bound |
async IO |
Programmer |
1 |
asyncio |
I/O-bound(preferred) |
0x01 asyncio in depth PEP3156
1.
coroutines
**coroutines是基于generator的**
PEP-342
2.
Futures
3.
Tasks
0x02 asyncio in action
基本用法主要参考python官方文档
step 1. 首先构建小的coro
step 2. 通过小的coro构建task, task可以是多个(比如一个producer task,一个customer task)
step 3. 选择task的运行模式(chained model, producer/customer model)
step 4. run
async def
: Native Coroutine/Asynchronous Generator declaration syntax
1.
generator-based coroutines未来不会再支持 两者的区别
2.
Asynchronous Generator是py36新特性,不常用先不讨论 PEP525
- Things a coroutine can do:
1.
Creating tasks
2.
Running Tasks Concurrently
- Design Patterns (code snippets)
这里的design pattern是对于task类型而言的
类型 |
特点 |
chained |
eventloop中的每个task都是一样的顺序执行, task中会有大量的io操作 |
producer/customer |
eventloop中的有两(多)种不同类型的task,task中会有大量的io操作 |
1.
chained model
每个task都是先运行phase1(io操作),等待phase1返回结果后运行phase2(io操作)
code from pymotw
2.
producer/customer model
task中有两类: 生产者和消费者
难点在于通知消费者生产已经完成了,在示例代码中是在producer完成之后先调用await q.join()
等待队列消费完成,后显示对每个customer调用cancel
code from realpython
asyncio的task数量在实际中会受到限制,可能原因如下:
1.
可以一起创建task数量有限:实际中不可能在程序一开始就生成无限数量的task
2.
eventloop中并发的task数量有限:同样是受到资源的限制
引入TaskPool 参考链接
核心思想是使用信号量asyncio.Semaphore
限制task的生成数量,
一个task完成后释放信号量使得新的一个task准备并执行
Code snippets for taskpool
tags: python asyncio aiohttp concurrency multiprocessing threading