获取python多处理中当前正在执行的输入的索引

use*_*827 14 python multiprocessing

    from multiprocessing import Pool
    with Pool(processes=5) as p:
        p.starmap(name_of_function, all_inputs)
Run Code Online (Sandbox Code Playgroud)

我有一段像上面这样并行执行函数的代码.假设all_inputs有10,000个元素,我想知道哪个元素正在执行,例如10,000个中的100个...有没有办法获得该索引?

geo*_*xsh 9

其中的工作进程multiprocessing.Pool是一个实例Process,它保留一个内部计数器来标识自己,您可以将此计数器与OS进程ID一起使用:

import os
from multiprocessing import current_process, Pool


def x(a):
    p = current_process()
    print('process counter:', p._identity[0], 'pid:', os.getpid())


if __name__ == '__main__':
    with Pool(2) as p:
        r = p.map(x, range(4))
    p.join()
Run Code Online (Sandbox Code Playgroud)

收益率:

process counter: 1 pid: 29443
process counter: 2 pid: 29444
process counter: 2 pid: 29444
process counter: 1 pid: 29443
Run Code Online (Sandbox Code Playgroud)

  • 这看起来像是工作人员的 ID,但不是处理了多少项目的计数。 (4认同)
  • 因为这是原始问题似乎要求的. (3认同)

Tai*_*Tai 6

IIUC,您也可以传入索引。(从@user1767754 窃取设置)(如果这不是您要找的,请告诉我。)

from multiprocessing import Pool

arr = [1,2,3,4,5]
arr_with_idx = zip(arr, range(len(arr)))

def x(a, idx):
    print(idx)
    return a*a

with Pool(5) as p:
    p.starmap(x, arr_with_idx)
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说,使用 enumerate

from multiprocessing import Pool

arr = [1,2,3,4,5]

def x(idx, a):  # different here
    print(idx)
    return a*a

with Pool(5) as p:
    p.starmap(x, enumerate(arr))
Run Code Online (Sandbox Code Playgroud)

starmap 将解包每个元组,您可以打印出索引部分。


use*_*754 5

您可以使用current_process多处理中的方法.如果这不够准确,你甚至可以name使用a 传递进程uuid

from multiprocessing import current_process


def x(a):
    print(current_process(), a)
    return a*a

with Pool(5) as p:
    p.map(x, [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)