比如,如果我这么干,会报错 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 是我弄错了,这个问题跟 golbal 没关系。
我想问的是,多进程创建的时候为什么没有把 result 复制给子进程。。。 |
3
araraloren 2016-05-09 09:03:27 +08:00
拿`linux`下的`fork`来说,进程复制的是`fork`之前的父进程拥有的东西,`fork`之后的东西就不会再复制了。。
|
4
yanyuechuixue OP @araraloren 嗯,谢谢!
|