之前氵了几篇
➡️ 两个python多进程的模板:
https://blog.csdn.net/HaoZiHuang/article/details/127267686
可以极大提升生产力
➡️ 但是进程间有共享变量怎么办呢?
https://blog.csdn.net/HaoZiHuang/article/details/127494251
借助 Manager 类可以创建共享 list 和 dict,但是对速度的影响较大 (至少我当前版本和遇到的问题是这样hhh)
➡️ 有时候遇到多进程程序不运行怎么办?排查指南
https://blog.csdn.net/HaoZiHuang/article/details/128010172
上文也转载了大佬的文章:
https://www.7forz.com/3408/
➡️ 多进程间共享内存怎么用,甚至可以使用 numpy 数组
➡️ 有时候我不需要进程池,我只需要一个临时的进程怎么办?
https://blog.csdn.net/HaoZiHuang/article/details/124001774
本来以为整一个多进程的进度条,需要用共享变量呢:
这里有个共享变量的用法:
https://stackoverflow.com/questions/2080660/how-to-increment-a-shared-counter-from-multiple-processes
然而实际上只需要 tqdm
和 pool.imap_unordered
from multiprocessing import Pool
import tqdm
# do_work = lambda x:2 # 注意无法序列化 lambda 表达式
def do_work(x):
return x*x
if __name__ == "__main__":
pool = Pool(processes=8)
tasks = list(range(100000))
for _ in tqdm.tqdm(pool.imap_unordered(do_work, tasks), total=len(tasks)):
# print("\r%d"%_)
pass
这里再说一下一下几者的区别与联系
imap
、map
、imap_unordered
和 map_async
imap
返回一个迭代器,有一个进程算出来一个结果,它返回一个,所以可以显示进度map
会等所有的结果都完成之后统一返回
imap
和 imap_unordered
都会立即返回结果
- 使用
imap
,进程完成他的任务之后就立即返回结果,但是会保留输入的顺序 - 使用
imap_unordered
,无论输入的顺序如何,只要有进程完成任务,就会立即返回结果,所以显示进度条的话用这个而不是imap
map
和 map_async
的主要区别就是是否会阻塞主进程:
map
是会阻塞主进程,会停在 pool.map 那一步
import time
from multiprocessing import Pool as mp
def run(num):
print('PROCESS {} starts'.format(num))
if num == 0:
time.sleep(5)
print('PROCESS {} ends'.format(num))
if __name__ == '__main__':
print('start')
pool = mp(5)
num_list = [0, 1, 2]
pool.map(run, num_list)
print('阻塞~~~~')
pool.close()
pool.join()
print('end')
map_async
是不会阻塞主进程,不会停在 pool.map_async
那一步
import time
from multiprocessing import Pool as mp
def run(num):
print('PROCESS {} starts'.format(num))
if num == 0:
time.sleep(5)
print('PROCESS {} ends'.format(num))
if __name__ == '__main__':
print('start')
pool = mp(5)
num_list = [0, 1, 2]
pool.map_async(run, num_list)
print('非阻塞~~~~')
pool.close()
pool.join()
print('end')
以上程序转载自:
https://testerhome.com/topics/18476