我用python 3.6和python 3.7测试了两个案例的代码。
1个案例(使用类别的成员变量
import multiprocessing as mp
import sys
class Foo:
def do_multiprocessing(self):
ctx = mp.get_context('spawn')
self.process_1 = ctx.Process(target=self.do_stuff1)
self.process_2 = ctx.Process(target=self.do_stuff2)
self.process_1.start()
self.process_2.start()
def do_stuff1(self):
print("Doing 1")
def do_stuff2(self):
print("Doing 2")
if __name__ == "__main__":
print("PYTHON VERSION : ", sys.version)
foo = Foo()
foo.do_multiprocessing()
结果:当我使用python 3.6执行它时,运行良好。然而,当我使用python 3.7执行它时,出现了一个错误。(类型错误:无法抓取weakref对象(
2种情况(使用局部变量
import multiprocessing as mp
import sys
class Foo:
def do_multiprocessing(self):
ctx = mp.get_context('spawn')
process_1 = ctx.Process(target=self.do_stuff1)
process_2 = ctx.Process(target=self.do_stuff2)
process_1.start()
process_2.start()
def do_stuff1(self):
print("Doing 1")
def do_stuff2(self):
print("Doing 2")
if __name__ == "__main__":
print("PYTHON VERSION : ", sys.version)
foo = Foo()
foo.do_multiprocessing()
结果:当我使用python 3.6和python 3.7执行它时,运行良好。
为什么不能使用类的成员变量执行多进程?为什么可以使用局部变量执行多进程?
我不明白为什么要执行代码。
p.s.(如果使用mp.get_context('fork'(,那么在案例1中使用python3.6和python3.7的代码可以很好地工作。
通过将self.do_stuff2
传递给process_2
,您试图让该进程访问self
的整个(作为隐式参数(,其中包括self.process_1
。您可以看到,让一个子进程对另一个子进程进行有意义的访问可能会很复杂(除非您让操作系统用'fork'
复制整个(父(进程(。