我目前正在使用带有池的python多处理模块来同时运行数百万次的函数。虽然多处理工作良好,但该功能非常轻巧,每个核心仅使用30%,并且仅在Locking()期间线程最大化。看看我的脚本的配置文件,确实锁定是最昂贵的。
鉴于每个函数的运行时间非常短,每次我映射到函数和运行函数时锁定之间的权衡是不值得的(实际上我通过串行运行获得了更好的性能; 15分钟并行化与4.5分钟连续)。
该函数写入独立文件,因此调用完全独立。是否有可能“模仿”多次运行/调用相同的并行化python脚本(使用不同的输入)以更多地使用CPU?
当前代码:
pool = Pool(cpu_count(), initializer=tqdm.tqdm.set_lock, initargs=(Lock(),))
for _ in tqdm.tqdm(pool.imap_unordered(parallel_process, pubfiles, chunksize=70), total=nfiles, desc='Parsing files'):
pass
修改
为了确保它与tqdm的锁定无关,将代码修改为以下内容会遇到同样的问题:
pool = Pool(cpu_count())
for i in pool.imap_unordered(parallel_process, files, chunksize=70):
print(i)
我已经对我的代码进行了一段时间的分析,而且大多数昂贵的进程似乎都与锁定(?)/多处理有关。实际功能非常接近处理时间的底部。
答案 0 :(得分:0)
这个问题与多处理无关 - 我的函数是IO绑定的,因为每次调用都是读写文件到磁盘,这是并行运行时的瓶颈。分块和减少写入的文件数量减少了这个瓶颈,上面的多处理代码(并行性)工作得非常好!