Python的多处理功能不能很好地使用threading.local?

dav*_*off 10 python multithreading multiprocessing python-multithreading

我有两个进程(参见示例代码),每个进程都尝试访问threading.local对象.我希望下面的代码打印"a"和"b"(按任意顺序).相反,我得到"a"和"a".当我启动整个新进程时,如何优雅而强大地重置threading.local对象?

import threading
import multiprocessing
l = threading.local()
l.x = 'a'
def f():
    print getattr(l, 'x', 'b')
multiprocessing.Process(target=f).start()
f()
Run Code Online (Sandbox Code Playgroud)

编辑:作为参考,当我使用threading.Thread而不是multiprocessing.Process时,它按预期工作.

imm*_*tal 9

您提到的两种操作系统都是基于Unix/Linux的,因此实现了相同的fork()API.甲fork()完全复制过程对象,以其存储器,加载代码,打开文件描述符和线程沿.此外,新进程通常在内核中共享相同的进程对象,直到第一次内存写入操作.这基本上意味着本地数据结构也与线程局部变量一起被复制到新进程中.因此,您仍然具有相同的数据结构并且l.x仍然是定义的.

要重置新进程的数据结构,我建议进程启动函数首先调用一些清除方法.例如,您可以使用process_id = os.getpid()和存储父进程pid

if process_id != os.getpid(): 
   clear_local_data()
Run Code Online (Sandbox Code Playgroud)

在子进程中的主要功能.