Python多处理和全局变量

时间:2014-03-12 07:30:27

标签: python linux windows multiprocessing global

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和管理在两个操作系统中的区别

1 个答案:

答案 0 :(得分:2)

要使代码在Windows和Linux上的行为相似,请明确传递b

Process(target=fb2, args=(k, b))

不同之处在于默认使用Linux fork,它会复制父进程对子进程的任何状态。这就是为什么fmt()内部所做的更改在儿童中可见。

Windows默认使用spawn启动方法仅部分再现全局状态,例如,导入时间内设置的值可见,但fmt()内的更改不是。