首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行处理2 for循环时无法获取值

并行处理2 for循环时无法获取值
EN

Stack Overflow用户
提问于 2017-07-21 13:31:37
回答 1查看 53关注 0票数 1

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-07-21 14:24:42

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

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

代码语言:javascript
复制
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()

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45229677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档