【问题标题】:Different inputs for different processes in python multiprocessingpython多处理中不同进程的不同输入
【发布时间】:2016-12-20 22:43:47
【问题描述】:

请多多包涵,因为这是我实际应用的一个人为示例。假设我有一个数字列表,我想使用多个 (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

是否有一种简单的方法可以指定每个进程的特定输入?有没有其他方法可以考虑这个问题?

【问题讨论】:

    标签: python multiprocessing python-multiprocessing


    【解决方案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))
    

    我的电脑是双核的,你可以看到只有 Process-0 和 Process-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', ... ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多