gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:28:19 25 4
gpt4 key购买 nike

我有两个进程(参见示例代码),每个进程都尝试访问一个 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()

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

最佳答案

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

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

if process_id != os.getpid(): 
clear_local_data()

在子进程main函数中。

关于Python 的多处理不能很好地与 threading.local 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7285541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com