python - python - 我希望多个线程产生多个进程,所有进程都应该并行运行
问题描述
我有一个名为 的函数run_3_processes
,它使用 产生3个进程(duh)multiprocessing.pool.apply
,等待它们的结果并处理这些结果并返回一个结果。
我有另一个名为 的函数run_3_processes_3_times
,它应该并行run_3_processes
运行3 次,等待它们全部返回,然后处理它们的所有结果。
我尝试过的事情:
- 使用进程池
run_3_processes_3_times
- 事实证明这很复杂,因为Python 进程池非守护进程? - 重写整个应用程序代码以使用同一个池生成 9 个进程 - 这确实使我的代码复杂化并破坏了封装
- 使用
threadpool.apply
forrun_3_processes_3_times
- 出于某种原因,这使它串行运行,而不是并行运行 - 是因为apply
inrun_3_processes
阻塞了 GIL?
我确定我缺少一个单行解决方案...谢谢!
解决方案
由于您使用的是真正的线程和子进程的组合,您将“有点”遇到 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>
推荐阅读
- c - free() : 无效指针以及如何重用当前释放的指针
- powershell - Powershell 将文件上传到 SharePoint:使用“0”参数错误调用“ExecuteQuery”的异常
- unity3d - Unity-3D我如何在手机中查看多边形数量?
- sql-server - 比较 SQL Server 中包含相同值的两列
- azure - 在 Azure 中,使用 azure devops 管道中的 powershell 脚本将负载平衡器详细信息写入 csv 文件
- python - 使用 Stanza 和 CoreNLPClient 提取名词短语
- javascript - 如何在 vue 中更新 chart.js
- angular - 特定列上的角度表过滤器
- c# - 无法创建 SSL/TLS 安全通道 - 在 Windows Server 2012 上
- python - 使用特定模板生成带有“零”的数字