【问题标题】:Python multiprocessing multiple processes per threadPython每个线程多处理多个进程
【发布时间】:2018-10-27 22:22:29
【问题描述】:

我目前正在使用带有池的 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)

我已经对我的代码进行了一段时间的分析,而且最昂贵的进程似乎通常与锁定 (?)/多处理有关。实际函数的处理时间非常接近底部。

【问题讨论】:

  • 也许看看 map/imap 的东西 (docs.python.org/2/library/…) 的块大小较大?
  • 我总共有 900 个要并行化的文件。将 chunksize 设置为 900(因此它在开始时锁定线程一次),仍然使用总 CPU 的 18%。然而,在运行的初始部分,锁定会使用 100% 的所有内核/线程几秒钟(确认多处理工作正常)。
  • chunksize 最多应该是项目数/工人数。默认块大小是该数字的 1/4(因此每个工作人员平均获得 4 个集合)。如果在文件级别处理,所有 900 都转到一个进程,其他进程处于空闲状态。
  • 你指的是哪个锁?它在多处理队列中吗?你用Manager(可能很贵)吗?
  • 感谢 tdelaney 的加入。在 Tom 发表评论后,我遇到了这个问题:stackoverflow.com/questions/3822512/…,我将其设置为 900/12(线程数)到 70 左右,并从每个 python 进程中获得 0.8% .

标签: python parallel-processing multiprocessing threadpool python-multiprocessing


【解决方案1】:

这个问题与多处理无关 - 我的函数是 IO 绑定的,因为每个调用都在读取和写入文件到磁盘,这在并行运行时是一个瓶颈。分块和减少写入的文件数量减少了这个瓶颈,上面的多处理代码(并行性)工作得非常好!

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2021-07-16
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多