在使用多处理modu时看不到对对象属性所做的更改

2024-04-16 04:56:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中使用多处理时,如果要导入模块,为什么模块中的任何实例变量都是通过副本传递给子进程的,而在args()参数中传递的和参数是通过引用传递的

这可能与线程安全有关吗

foo.py

class User:
    def __init__(self, name):
        self.name = name


foo_user = User('foo')

main.py

import multiprocessing

from foo import User, foo_user

def worker(main_foo):
    print(main_foo.name) #prints 'main user'
    print(foo_user.name) #prints 'foo user', why doesn't it print 'override'

if __name__ == '__main__':

    main_foo = User('main user')
    foo_user.name = 'override'

    p = multiprocessing.Process(target=worker, args=(main_foo,))
    p.start()
    p.join()

编辑:我是个白痴,self.name = None应该是self.name = name。我在代码中做了更正,忘了把它复制回来


Tags: 模块namepyimportself参数foomain
1条回答
网友
1楼 · 发布于 2024-04-16 04:56:20

实际上,它有打印覆盖。看看这个:

$ python main.py
None
override

但是!这只发生在*尼克斯。我猜你是在Windows上运行的。不同之处在于,在Windows中,会生成一个新的解释器副本来运行函数,而不会对foo_user.name进行更改,因为在这个新实例中,__name__不是__main__,因此不会执行代码位。这样做是为了防止无限递归

如果将这一行添加到函数中,您将看到不同之处:

def worker(main_foo):
    print(__name__)
    ...

它在*Nix上打印__main__。但是,对于Windows,它将不是__main__

如果你想让它工作的话,你需要把那行从if __name__ == __main__块中移出

相关问题 更多 >