【问题标题】:multiprocessing a function execution with python用python多处理一个函数执行
【发布时间】:2022-02-08 01:20:17
【问题描述】:

我有一个由大约 1M 行组成的 pandas 数据框,它包含用户输入的信息。我写了一个函数来验证用户输入的数字是否正确。我想要做的是在多个处理器上执行该功能,以克服在单个处理器上进行大量计算的问题。我所做的是将我的数据帧分成多个块,每个块包含 50K 行,然后使用 python 多处理器模块分别对每个块执行处理。问题是只有第一个进程正在启动并且它仍然使用一个处理器而不是在所有处理器上分配负载。这是我写的代码:

 pool = multiprocessing.Pool(processes=16)
 r7 = pool.apply_async(validate.validate_phone_number, (has_phone_num_list[0],fields ,dictionary))
 r8 = pool.apply_async(validate.validate_phone_number, (has_phone_num_list[1],fields ,dictionary))
 print(r7.get())
 print(r8.get())
 pool.close()
 pool.join()

我附上了一张截图,显示了执行上述代码时的CPU使用率

关于如何克服这个问题的任何建议?

【问题讨论】:

  • 你可以使用Pool.map()。这将允许您将可迭代对象异步映射到线程池
  • 只是为了澄清我的理解,你是说 has_phone_num_list 有 20 个元素 - 即 20 * 50_000 == 1_000_000
  • @OlvinR​​oght 是的
  • @2pichar 我试过了,没有解决问题
  • 看起来大部分工作仍在主进程中完成(仅加载了一个 cpu 核心)。向每个子进程发送大量数据(参数和返回值)效率相当低,这发生在主进程中。

标签: python multiprocessing python-multiprocessing


【解决方案1】:

我建议你试试这个:

from concurrent.futures import ProcessPoolExecutor

with ProcessPoolExecutor() as executor:
    params = [(pnl, fields, dictionary) for pnl in has_phone_num_list]
    for result in executor.map(validate.validate_phone_number, params):
        pass # process results here

通过不带参数构造 ProcessPoolExecutor,您的大部分 CPU 将被充分利用。这是一种非常便携的方法,因为没有关于可用 CPU 数量的明确假设。当然,您可以使用 max_workers=N 进行构造,其中 N 是一个较小的数字,以确保同时使用最少数量的 CPU。如果您不太关心整个过程需要多长时间,您可以这样做。

【讨论】:

    【解决方案2】:

    As suggested in this answer,你可以使用 pandarallel 来并行使用 Pandas 的 apply 功能。不幸的是,由于我无法尝试您的代码,我无法找到问题所在。您是否尝试使用更少的处理器(例如 8 个而不是 16 个)?

    请注意,在某些情况下并行化不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2021-02-21
      • 2020-11-29
      相关资源
      最近更新 更多