Python多重处理:按值传递对象?

发布于 2021-01-29 15:03:43

我一直在尝试以下方法:

from multiprocessing import Pool

def f(some_list):
    some_list.append(4)
    print 'Child process: new list = ' + str(some_list)
    return True

if __name__ == '__main__':

    my_list = [1, 2, 3]
    pool = Pool(processes=4)
    result = pool.apply_async(f, [my_list])
    result.get()

    print 'Parent process: new list = ' + str(my_list)

我得到的是:

Child process: new list = [1, 2, 3, 4]
Parent process: new list = [1, 2, 3]

因此,这意味着 my_list 是按值传递的,因为它没有突变。那么,是否将规则传递给另一个进程时确实按值传递规则呢?谢谢。

关注者
0
被浏览
238
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    正如AndréLaszlo所说,该multiprocessing库需要对传递给multiprocessing.Pool方法的所有对象进行腌制,以将它们传递给工作进程。酸洗过程导致在工作进程中创建一个不同的对象,因此在工作进程中对该对象所做的更改不会影响父对象中的对象。在Linux上,对象有时会通过fork继承传递给子进程(例如multiprocessing.Process(target=func, args=(my_list,))),但是在这种情况下,您最终会在子进程中获得对象的写时复制版本,因此当您执行操作时,仍然会得到不同的副本尝试在任一过程中对其进行修改。

    如果确实要在进程之间共享对象,则可以multiprocessing.Manager为此使用a

    from multiprocessing import Pool, Manager
    
    def f(some_list):
        some_list.append(4)
        print 'Child process: new list = ' + str(some_list)
        return True
    
    if __name__ == '__main__':
    
        my_list = [1, 2, 3]
        m = Manager()
        my_shared_list = m.list(my_list)
        pool = Pool(processes=4)
        result = pool.apply_async(f, [my_shared_list])
        result.get()
    
        print 'Parent process: new list = ' + str(my_shared_list)
    

    输出:

    Child process: new list = [1, 2, 3, 4]
    Parent process: new list = [1, 2, 3, 4]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看