python - python 多处理映射中的 PID 是否保证相对于可迭代对象具有递增顺序?
问题描述
我有一个列表,我分块进行多处理,假设它是:
l = range(100)
假设我有 10 个 CPU(如 中multiprocessing.cpu_count()
)。List被分成10个chunk,然后每个进程通过函数l
负责每个chunk :foo
#pseudocode
def foo(chunk):
pid = multiprocessing.current_process().pid
for elem in chunk:
pr_elem = process(elem)
write pr_elem in ('out' + str(pid)) file
from more_itertools import divide
p = multiprocessing.Pool(multiprocessing.cpu_count())
p.map(foo, divide(multiprocessing.cpu_count(), l))
分配的 PID 的顺序是否总是相对于可迭代的递增顺序?我可以依靠这个顺序并结合out[pid]
文件中的结果,并且顺序将匹配列表中的块(以及元素)吗?
解决方案
当然不。我有 8 个逻辑核心,4 个物理核心。在下面的代码中,我创建了一个大小为 4 的池并调用map
指定块大小为 1 的函数,以便工作函数一次只抓取一个提交的任务。我还在工作函数中立即插入一个sleep
调用作为第一条指令,以确保给定进程不会处理所有提交的任务。这样,我希望池中的 4 个进程中的每一个都处理一个提交的任务,并且打印语句将按提交任务的顺序出现。
import multiprocessing
import time
def worker(x):
time.sleep(1 + x)
print(x, multiprocessing.current_process().pid)
def main():
pool = multiprocessing.Pool(4)
pool.map(worker, range(4), chunksize=1)
if __name__ == '__main__':
main()
印刷:
0 26632
1 15800
2 25916
3 30356
推荐阅读
- mongodb - mongo local server uninstallition
- angular - 创建项目时无法取消定义 Angular 6
- reactjs - 如何在没有 Redux 的情况下更新子组件而不重新渲染
- angular - 用于 Angular 的 Kendo UI 中的 ASP.NET Core OData Web 服务、Angular 5 和网格组件
- javascript - 打印预览如何仅显示部分视图
- java - Java RMI 连接错误:未连接到本地主机
- git - Git总是不提交修改过的文件
- list - 如何在 Java 8 中将对象列表转换为地图?
- reporting-services - 显示单列到多列(n 次)
- android-databinding - 使用 ViewModel 和 DataBinding 更新 UI