Python并发调度
背景
最近遇到一个问题,需要刷一批数据,数据量很大,串行耗时很长,这时候需要并发进行刷数据,用python实现并发调用,并能合理的控制并发量,是需要学习的一个地方。
方式就
线程池 or 协程
一、利用ThreadPoolExecutor开启并发调度
使用方法
- 引入ThreadPoolExecutor, as_completed ,都是在concurrent.futures下;
- 利用with ThreadPoolExecutor开启线程池;
- 设置ThreadPoolExecutor的max_workers设置最大并发数量;
- 利用submit方法提交执行的方法名,方法参数;
样例代码
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
NUMBERS = range(1, 100)
def fib(n):
time.sleep(10)
return n
# 开启线程池,最大线程数50
with ThreadPoolExecutor(max_workers=50) as executor:
start = time.time()
# executor中submit,submit(方法名,方法参数...): 参数名 for 参数名 in 参数list
numbers_ = {executor.submit(fib, num): num for num in NUMBERS}
# as_completed方法介绍在下面
for task in as_completed(numbers_):
# task_ = numbers_[task]
# 输出返回结果
print('result is {}'.format(task.result()))
end = time.time()
print('cost {}'.format(end - start))
as_completed()方法是一个生成器,在没有任务完成的时候,会阻塞,在有某个任务完成的时候,会yield这个任务,就能执行for循环下面的语句,然后继续阻塞住,循环到所有的任务结束。从结果也可以看出,先完成的任务会先通知主线程。
执行结果
10并发下:cost 100.13678193092346
50并发下:cost 20.117856979370117
原理
目前简单运行,原理待补充
二、协程
待补充