并行化2 for循环时无法获取值

时间:2017-07-21 05:31:37

标签: python parallel-processing multiprocessing python-multiprocessing

我正在尝试运行以下代码片段,将数据附加到列表'tests1'和'tests2'。但是当我打印'tests1'和'tests2'时,显示的列表为空。这里有什么不对的吗?

tests1 = []
tests2 = []

def func1():
    for i in range(25,26):
        tests1.append(test_loader.get_tests(test_prefix=new_paths[i],tags=params.get('tags', None),
                                    exclude=params.get('exclude', False)))

def func2():
    for i in range(26,27):
        tests2.append(test_loader.get_tests(test_prefix=new_paths[i],tags=params.get('tags', None),
                                    exclude=params.get('exclude', False)))


p1 = mp.Process(target=func1)
p2 = mp.Process(target=func2)

p1.start()
p2.start()
p1.join()
p2.join()

print tests1
print tests2

1 个答案:

答案 0 :(得分:0)

工作进程实际上并不共享同一个对象。它被复制(腌制)。

您可以使用multiprocessing.Queue(或通过各种其他方式)在流程之间发送值。请参阅我的简单示例(为了简单起见,我将测试用于整数)。

from multiprocessing import Process, Queue

def add_tests1(queue):
    for i in range(10):
        queue.put(i)
    queue.put(None)

def add_tests2(queue):
    for i in range(100,110):
        queue.put(i)
    queue.put(None)

def run_tests(queue):
    while True:
        test = queue.get()
        if test is None:
            break
        print test

if __name__ == '__main__':
    queue1 = Queue()
    queue2 = Queue()

    add_1 = Process(target = add_tests1, args = (queue1,))
    add_2 = Process(target = add_tests2, args = (queue2,))
    run_1 = Process(target = run_tests, args = (queue1,))
    run_2 = Process(target = run_tests, args = (queue2,))

    add_1.start(); add_2.start(); run_1.start(); run_2.start()
    add_1.join(); add_2.join(); run_1.join(); run_2.join()

请注意,父程序也可以访问队列。