首页 > 解决方案 > 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]文件中的结果,并且顺序将匹配列表中的块(以及元素)吗?

标签: pythonmultiprocessing

解决方案


当然不。我有 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

推荐阅读