Python multiprocessing 每个线程多个进程
Python multiprocessing multiple processes per thread
我目前正在使用 python 的多处理模块和一个池来同时 运行 一个函数数百万次。虽然多处理运行良好,但该函数非常轻量级,每个内核仅使用了 30%,线程仅在 Locking() 期间达到最大值。查看我的脚本配置文件,确实锁定是最昂贵的。
鉴于每个函数 运行 都很短,每次我映射到函数时锁定和 运行 启用函数之间的权衡是不值得的(事实上我通过 运行 串行化获得更好的性能;并行化 15 分钟对比串行化 4.5 分钟)。
该函数写入独立文件,因此调用是完全独立的。是否可以多次 'mimic' running/calling 相同的并行化 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)
我分析我的代码有一段时间了,最昂贵的进程似乎通常与锁定 (?)/多处理有关。实际功能非常接近底部的处理时间。
这个问题与多处理无关 - 我的函数是 IO 绑定的,因为每个调用都在磁盘上读取和写入文件,这在 运行 并行时是一个瓶颈。分块和减少写入的文件数量减少了这个瓶颈,上面的多处理代码(并行)工作得很好!
我目前正在使用 python 的多处理模块和一个池来同时 运行 一个函数数百万次。虽然多处理运行良好,但该函数非常轻量级,每个内核仅使用了 30%,线程仅在 Locking() 期间达到最大值。查看我的脚本配置文件,确实锁定是最昂贵的。
鉴于每个函数 运行 都很短,每次我映射到函数时锁定和 运行 启用函数之间的权衡是不值得的(事实上我通过 运行 串行化获得更好的性能;并行化 15 分钟对比串行化 4.5 分钟)。
该函数写入独立文件,因此调用是完全独立的。是否可以多次 'mimic' running/calling 相同的并行化 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)
我分析我的代码有一段时间了,最昂贵的进程似乎通常与锁定 (?)/多处理有关。实际功能非常接近底部的处理时间。
这个问题与多处理无关 - 我的函数是 IO 绑定的,因为每个调用都在磁盘上读取和写入文件,这在 运行 并行时是一个瓶颈。分块和减少写入的文件数量减少了这个瓶颈,上面的多处理代码(并行)工作得很好!