首页 > 解决方案 > python - 我希望多个线程产生多个进程,所有进程都应该并行运行

问题描述

我有一个名为 的函数run_3_processes,它使用 产生3个进程(duh)multiprocessing.pool.apply,等待它们的结果并处理这些结果并返回一个结果。

我有另一个名为 的函数run_3_processes_3_times,它应该并行run_3_processes运行3 次,等待它们全部返回,然后处理它们的所有结果。

我尝试过的事情:

  1. 使用进程池run_3_processes_3_times- 事实证明这很复杂,因为Python 进程池非守护进程?
  2. 重写整个应用程序代码以使用同一个池生成 9 个进程 - 这确实使我的代码复杂化并破坏了封装
  3. 使用threadpool.applyfor run_3_processes_3_times- 出于某种原因,这使它串行运行,而不是并行运行 - 是因为applyinrun_3_processes阻塞了 GIL?

我确定我缺少一个单行解决方案...谢谢!

标签: pythonmultiprocessingpython-multiprocessingpython-multithreading

解决方案


由于您使用的是真正的线程和子进程的组合,您将“有点”遇到 GIL,但它的结构方式使它看起来不太可能成为问题。将ThreadPool受到上下文切换以在线程之间提供并发性,但由于它的唯一目的是产生子进程,因此它不会做任何 CPU 密集型的事情。我不确定为什么甚至需要使用多个线程;我可能只会产生一个单线程父进程并直接等待子进程。

map()在这两个函数中,使用method 而不是可能更惯用apply_async(),尽管两者都可以。通常看起来有点像这样:

process_count = 3

def pre_process(input_data):
    input_subsets = [[]] * process_count
    for idx, data_point in enumerate(input_data):
        <do any input validation on data_point>
        input_subsets[idx % process_count].append(data_point)
    return input_subsets

def process_data(input_data):
    return_val = []
    for val in input_data:
        <do some processing work>
        return_val.append(<result of processing>) 
    return return_val

data_subsets = pre_process(raw_data)
pool = mp.Pool(process_count)
result_list = pool.map(process_data, data_subsets)
<check result_list>

推荐阅读