比如,如果我这么干,会报错 result 没有定义。
import multiprocessing def func(msg): print(result) if __name__ == "__main__": pool = multiprocessing.Pool(processes=4) global result result=[] for i in range(3): msg = "hello %d" %(i) pool.apply(func, (msg, )) pool.close() pool.join()
但如果我这么干,就不会报错:
import multiprocessing result=[] #在这里定义 def func(msg): print(result) if __name__ == "__main__": pool = multiprocessing.Pool(processes=4) for i in range(3): msg = "hello %d" %(i) pool.apply(func, (msg, )) pool.close() pool.join()
Python 的多进程在内存上是“使用时复制”,所以,就算在主函数外面定义,也相当于在函数里面定义吧?
![]() | 1 Ge4Los 2016-05-09 00:18:55 +08:00 在函数里面 global 其实是声明该变量为全局命名空间里的同名变量,不算定义。 第 2 个例子是依据 LEGB 原则找到全局变量 result 。 多进程的写时复制似乎与函数定义没必然联系,不太理解你最后一行的意义。 |
![]() | 2 yanyuechuixue OP /div> 是我弄错了,这个问题跟 golbal 没关系。 我想问的是,多进程创建的时候为什么没有把 result 复制给子进程。。。 |
![]() | 3 araraloren 2016-05-09 09:03:27 +08:00 拿`linux`下的`fork`来说,进程复制的是`fork`之前的父进程拥有的东西,`fork`之后的东西就不会再复制了。。 |
![]() | 4 yanyuechuixue OP @araraloren 嗯,谢谢! |