python我希望多个线程产生多个进程,所有进程都应该并行运行

2024-04-25 18:22:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我尝试过的事情:

  1. run_3_processes_3_times使用进程池——结果证明这很复杂,因为Python Process Pool non-daemonic?
  2. 重写整个应用程序代码,在同一个池中生成9个进程——这真的让我的代码很纠结,破坏了封装
  3. run_3_processes_3_times使用threadpool.apply是因为run_3_processes中的apply阻塞了GIL吗?出于某种原因,这使得它可以串行运行,而不是并行运行

我肯定我错过了一个简单的解决方案。。。谢谢


Tags: 函数run证明进程事情multiprocessingprocessprocesses
2条回答

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

在这两个函数中,使用map()方法而不是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>

好的,找到了一个老套的答案,我很想听听有没有更好的:


def run_3_processes_3_times():
        pool = ThreadPool(3)
        candidates = [pool.apply_async(run_3_processes,
                                 args=(c)) for c in range(3)]
        candidates = [x.get() for x in candidates]
        pool.close()

def run_3_processes(c):
        pool = mp.Pool(3)
        solutions = [pool.apply_async(do_it,
                                      args=(i) for i in range(3)]
        solutions = [x.get() for x in solutions]
        pool.close()

相关问题 更多 >