python线程池

百万年薪python之路 -- 并发编程之 多线程 三

老子叫甜甜 提交于 2019-11-28 17:19:22
1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: ​ 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. ​ 非阻塞: 进程没有遇到IO 当进程遇到IO,但我通过某种手段,让CPU强行运行我的进程 提交任务的角度: ​ 同步: 提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我在提交下一个任务. ​ 异步: 一次提交多个任务,然后我就直接执行下一行代码. 返回的结果,应该如何回收? eg: 给三个老师发布任务: ​ 同步: 先告知第一个老师完成写书的任务,然后我在原地等待,等他两天之后完成了,告知我完事了,我才发布下一个任务........ ​ 异步: 直接将三个任务告知三个老师,我就忙我的,知道三个老师完成之后,告知我. 2. 同步调用,异步调用 同步调用: # 同步调用 from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import time import random import os def task(i): print(f"{os.getpid()} 开始任务") time.sleep(random.randint(1,3)) print(f"{os.getpid()} 任务结束") return i

concurrent.futures:线程池,让你更加高效、并发的处理任务

大憨熊 提交于 2019-11-28 05:51:35
并发任务池 concurrent.futures模块提供了使用工作线程或进程池运行任务的接口。 线程池和进程池的API是一致的,所以应用只需要做最小的修改就可以在线程和进程之间进行切换 这个模块提供了两种类型的类与这些池交互。执行器(executor)用来管理工作线程或进程池,future用来管理计算的结果。 要使用一个工作线程或进程池,应用要创建适当的执行器类的一个实例,然后向它提交任务来运行。 每个任务启动时,会返回一个Future实例。需要任务的结果时,应用可以使用Future阻塞,直到得到结果。 目前已经提供了不同的API,可以很方便地等待任务完成,所以不需要直接管理Future对象。 Future对象 Future对象是一个比较奇特的对象,当然并不仅仅只是在这里有,像asyncio、tornado等,都有Future对象。怎么理解这个对象呢?Future直译是未来对象,换句话说,就是将我们的任务(函数)进行一层包裹,封装为未来对象。可以把Future看成是任务的一个容器,除了能够销毁任务,里面还包含了任务的执行状态。任务没有执行完没有关系,先占一个坑,绑定一个回调。我去异步执行其他的任务,当该任务完成后,通过future.set_result将任务的返回值设置进去,一旦设置了,那么会自动的触发回调函数,可以通过future.result将返回值获取出来。