【问题标题】:Python Multiprocessing and global variablesPython多处理和全局变量
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2019-12-12
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多