线程池和进程池的使用

线程池和进程池模块:

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)
线程池和进程池示例

 

 

posted @ 2017-07-28 18:43  luchuangao  阅读(551)  评论(0编辑  收藏  举报