线程池和进程池的使用
线程池和进程池模块:
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
Python2版本: 线程池:不支持 进程池:支持 Python3版本: 线程池:支持 进程池:支持
ThreadPoolExecutor 线程池
ThreadPoolExecutor 是一个 Executor 子类,它使用一个线程池来异步执行调用。
语法:
class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
一个 Executor 子类,它使用一个最多 max_workers 线程的池来异步地执行调用。
如果 max_workers 是 None 或未给出,它将默认为机器上的处理器数乘以 5,假设 ThreadPoolExecutor 经常用于重叠I/O而不是CPU工作,并且工作程序的数量应该高于数量的 ProcessPoolExecutor工人。
thread_name_prefix 参数,以允许用户控制由池创建的工作线程的threading.Thread名称,以便于调试。
ProcessPoolExecutor 进程池
ProcessPoolExecutor 类是一个 Executor 子类,它使用进程池来异步执行调用。 ProcessPoolExecutor 使用 multiprocessing 模块,它允许它侧面 Global Interpreter Lock,但也意味着只有可拾取对象可以被执行和返回。
__main__ 模块必须可以由worker子进程导入。这意味着 ProcessPoolExecutor 将不在交互式解释器中工作。(进程池必须在main中执行才生效)
从提交到 ProcessPoolExecutor 的可调用方调用 Executor 或 Future 方法将导致死锁。
语法:
class concurrent.futures.ProcessPoolExecutor(max_workers=None)
使用最多 max_workers 进程的池异步执行调用的 Executor 子类。如果 max_workers 是 None 或未给出,它将默认为机器上的处理器数。如果 max_workers 低于或等于 0,则将产生 ValueError。
当其中一个工作进程突然终止时,现在会出现 BrokenProcessPool 错误。以前,行为是未定义的,但对执行器或其未来的操作通常会冻结或死锁。
import time def task(i): time.sleep(1) print(i) for row in range(100): task(row)
# 100任务 import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def task(i): time.sleep(1) print(i) p = ThreadPoolExecutor(10) #有100个任务,每次只处理10个任务,其他任务等待前10个任务完成 # p = ProcessPoolExecutor(10) #进程池,只需要把ThreadPoolExecutor更改为ProcessPoolExecutor即可。 for row in range(100): p.submit(task,row)

浙公网安备 33010602011771号