import os
from multiprocessing import Process
b = {
'x':{
'd':[]
},
'y':{
'd':[]
},
}
def fmt():
global b
for k in b:
if not b[k]['d']:
b[k]['d'].append("fb1")
print b
t = Process(target=fb2, args=(k,))
t.daemon = False
t.start()
def fb2(k="x"):
print os.getpid(), k, b[k]
if __name__ == '__main__':
fmt()
Windows输出:
C:\Python27\python.exe C:/Users/qchen/PycharmProjects/syntax_test/syntax_test.py
{'y': {'d': ['fb1']}, 'x': {'d': []}}
{'y': {'d': ['fb1']}, 'x': {'d': ['fb1']}}
4412 y {'d': []}
5972 x {'d': []}
Linux输出:
qchen@ubuntu:~/PycharmProjects/for_test$ python syntax_test.py
{'y': {'d': ['fb1']}, 'x': {'d': []}}
{'y': {'d': ['fb1']}, 'x': {'d': ['fb1']}}
23547 y {'d': ['fb1']}
23548 x {'d': ['fb1']}
我不知道为什么Windows操作系统和Linux操作系统有所不同; 不同之处在于Process Fork和管理在两个操作系统中的区别
答案 0 :(得分:2)
要使代码在Windows和Linux上的行为相似,请明确传递b
:
Process(target=fb2, args=(k, b))
不同之处在于默认使用Linux fork
,它会复制父进程对子进程的任何状态。这就是为什么fmt()
内部所做的更改在儿童中可见。
Windows默认使用spawn
启动方法仅部分再现全局状态,例如,导入时间内设置的值可见,但fmt()
内的更改不是。