请耐心等待,因为这是我真实应用的一个人为例子。假设我有一个数字列表,我想使用多个(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
是否有一种简单的方法来指定每个流程的特定输入?还有另一种方法可以考虑这个问题吗?
答案 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', ... ]