python多处理中不同进程的不同输入

时间:2016-12-20 22:43:47

标签: python multiprocessing python-multiprocessing

请耐心等待,因为这是我真实应用的一个人为例子。假设我有一个数字列表,我想使用多个(2)进程为列表中的每个数字添加一个数字。我可以这样做:

import multiprocessing
my_list = list(range(100))
my_number = 5
data_line = [{'list_num': i, 'my_num': my_number} for i in my_list]

def worker(data):
    return data['list_num'] + data['my_num']

pool = multiprocessing.Pool(processes=2)
pool_output = pool.map(worker, data_line)
pool.close() 
pool.join()

然而,现在,我的问题出现了问题。假设我想要替换添加两个数字(而不是仅添加一个)。所以大约一半的时间,我想添加my_number1,另外一半我要添加my_number2。将哪个数字添加到列表中的哪个项目无关紧要。但是,一个要求是我不希望在不同的进程中同时同时添加相同的数字。基本上(我认为)归结为我想要使用进程1上的第一个数字和进程2上的第二个数字,以便进程永远不会同时添加相同的数字。如下所示:

my_num1 = 5
my_num2 = 100
data_line = [{'list_num': i, 'my_num1': my_num1, 'my_num2': my_num2} for i in my_list]
def worker(data):
    # if in Process 1:
    return data['list_num'] + data['my_num1']
    # if in Process 2:
    return data['list_num'] + data['my_num2']
    # and so forth

是否有一种简单的方法来指定每个流程的特定输入?还有另一种方法可以考虑这个问题吗?

1 个答案:

答案 0 :(得分:1)

multiprocessing.Pool允许执行初始化函数,该函数将在实际给定函数运行之前执行。

您可以将它与全局变量一起使用,以使您的函数能够了解正在运行的进程。

您可能希望控制进程获得的初始数量。您可以使用Queue向进程通知要接收的号码。

此解决方案并非最佳,但可行。

import multiprocessing


process_number = None


def initializer(queue):
    global process_number

    process_number = queue.get()  # atomic get the process index


def function(value):
    print "I'm process %s" % process_number

    return value[process_number]


def main():
    queue = multiprocessing.Queue()

    for index in range(multiprocessing.cpu_count()):
        queue.put(index)

    pool = multiprocessing.Pool(initializer=initializer, initargs=[queue])

    tasks = [{0: 'Process-0', 1: 'Process-1', 2: 'Process-2'}, ...]

    print(pool.map(function, tasks))

我的电脑是双核心,因为你只能看到处理过程0和过程1。

I'm process 0
I'm process 0
I'm process 1
I'm process 0
I'm process 1
...
['Process-0', 'Process-0', 'Process-1', 'Process-0', ... ]