threadpool模块
线程池
import threadpool
def say(what):
"""
调用的线程函数
:params what: 说啥
:return 说啥:
"""
print(what)
return what
size = 10 # 线程数量
pool = threadpool.ThreadPool(threadnum) # 创建线程
word_list = ['you', 'are', 'a', 'sb']
requests = threadpool.makeRequests(startexam, word_list) # 创建线程池对象
[pool.putRequest(req) for req in requests] # 执行线程
pool.wait() # 关闭线程池
使用步骤:
步骤 | 代码 | 解释 |
---|---|---|
创建线程池(指定大小) | 线程池对象 = threadpool.ThreadPool(大小) | 申请一个的线程池对象 |
传递参数列表 | 方法对象 = threadpool.makeRequests(函数名, 参数列表) | 让线程池把一个列表中的元素作为参数异步执行函数(尚未开始执行) |
执行 | [线程池对象.putRequest(req) for req in 方法对象] | 把上面生成的传递参数后的方法创建并执行 |
过程:创建 => 传参 => 执行
multiprocessing模块
多进程
import multiprocessing
def do(n): # 参数n由args=(1,)传入
name = multiprocessing.current_process().name # 获取当前进程的名字
print(name, 'starting')
print("worker ", n)
return
if __name__ == '__main__':
numList = []
for i in range(5):
p = multiprocessing.Process(target=do, args=(i,)) # (i,)中加入","表示元祖
numList.append(p)
print(numList)
p.start() # 用start()方法启动进程,执行do()方法
p.join() # 等待子进程结束以后再继续往下运行,通常用于进程间的同步
print("Process end.")
进程池
import time
from multiprocessing import Pool
def run(fn):
# fn: 函数参数是数据列表的一个元素
time.sleep(1)
print(fn * fn)
if __name__ == "__main__":
testFL = [1, 2, 3, 4, 5, 6]
print('shunxu:') # 顺序执行(也就是串行执行,单进程)
s = time.time()
for fn in testFL:
run(fn)
t1 = time.time()
print("顺序执行时间:", int(t1 - s))
print('concurrent:') # 创建多个进程,并行执行
pool = Pool(3) # 创建拥有3个进程数量的进程池
# testFL:要处理的数据列表,run:处理testFL列表中数据的函数
pool.map(run, testFL)
pool.close() # 关闭进程池,不再接受新的进程
pool.join() # 主进程阻塞等待子进程的退出
t2 = time.time()
print("并行执行时间:", int(t2 - t1))
Pool类说明:
(Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求)
方法 | 说明 |
---|---|
apply(func[, args=()[, kwds={}]]) | 该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不再出现) |
apply_async(func[, args=()[, kwds={}[, callback=None]]]) | 与apply用法一致,但它是非阻塞的且支持结果返回后进行回调 |
map(func, iterable[, chunksize=None]) | Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回 (注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程) |
map_async(func, iterable[, chunksize[, callback]]) | 与map用法一致,但是它是非阻塞的 |
close(pool) | 关闭进程池(pool),使其不再接受新的任务 |
terminal() | 结束工作进程,不再处理未处理的任务 |
join() | 主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用 |