multiprocessing 与 threading对比
这两个库都可以实现多线程操作,而且因为多线程的思路其实差不多,所以提供的API也比较类似,但是本地实际测试中,发现multiprocessing 对多核CPU的支持更好。
Demo
import multiprocessing as mp
from tqdm import tqdm
def listener(q):
pbar = tqdm(total = 1000)
while True:
if not q.empty():
k=q.get()
if k==1:
pbar.update(1)
else:
break
pbar.close()
def solve(q):
for i in range(100):
q.put(1)
if __name__ == '__main__':
manage=mp.Manager()
q=manage.Queue()
p=mp.Process(target=listener,args=(q,))
p.start()
processList=[]
for i in range(10):
t=mp.Process(target=solve,args=(q,))
processList.append(t)
t.start()
for i in processList:
t.join()
q.put(-1)
p.join()
实现主要是通过manage.Queue来实现。
为了测试方便,这里只是做了一个简单的分片(将1000条数据分为10片,每个线程处理1片,每片100条数据)。
在每个线程处理完成一条数据后,向queue中写入一条记录。 另外一个单独的线程用来抑制获取queue里面的数据,如果有新的数据相当于进度加1。
上面代码中的t.join()
用来处理每一片的数据,在这些处理完成以后,再讲打印进度条的进程join进来,以保证可以完整打印整个进度条。