【发布时间】:2023-03-15 03:45:01
【问题描述】:
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和管理的不同
【问题讨论】:
-
你为什么首先使用全局变量?不要成为那个人。
-
看起来在 Linux 上您打印了
b[k](尽管您的代码),而在 Windows 上您确实打印了b(如代码所述)。由于使用的代码有所不同(至少这是最简单的解释),你可能搞砸了。我建议比较您在两个系统上运行的两个版本,删除所有差异,然后重试该实验。那时可能特性已经消失了。 -
要在 Linux 上测试,你可以使用Python 3.4 and
multiprocessing.set_start_method('spawn')来避免fork-semantics。 -
global b是没用的,除非函数(或其他绑定语句)中有b = .. -
第一次打印是我的错;
标签: python linux windows multiprocessing global