gpt4 book ai didi

Python multiprocessing.Process 对象的行为就像它持有对另一个进程中的对象的引用。为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:15 25 4
gpt4 key购买 nike

import multiprocessing as mp

def delay_one_second(event):
print 'in SECONDARY process, preparing to wait for 1 second'
event.wait(1)
print 'in the SECONDARY process, preparing to raise the event'
event.set()

if __name__=='__main__':
evt = mp.Event()
print 'preparing to wait 10 seconds in the PRIMARY process'
mp.Process(target = delay_one_second, args=(evt,)).start()
evt.wait(10)
print 'PRIMARY process, waking up'

此代码(使用 cmd.exe 中的“python module.py”命令从模块内部很好地运行)产生了令人惊讶的结果。

主进程显然只等了 1 秒钟就被唤醒了。如果发生这种情况,则意味着辅助进程具有对主进程中对象的引用。

这怎么可能?我期望必须使用 multiprocessing.Manager() 来在进程之间共享对象,但这怎么可能?

我的意思是进程不是线程,它们不应该使用相同的内存空间。有人知道这里发生了什么吗?

最佳答案

简短的回答是共享内存不是由单独的进程管理的;它由操作系统本身管理。

如果您花一些时间浏览 multiprocessing 源代码,您就会看到它是如何工作的。你会看到一个 Event对象使用 Semaphore和一个 Condition ,两者都依赖于 SemLock 提供的锁定行为目的。这反过来又包装了一个 _multiprocessing.SemLock对象,它在 c 中实现并依赖于 sem_open (POSIX) 或 CreateSemaphore ( window )。

这些是允许访问由操作系统本身管理的共享资源的 c 函数——在本例中,称为信号量。它们可以在线程进程之间共享;操作系统负责一切。发生的事情是,当创建一个新的信号量时,它会被赋予一个句柄。然后,当需要访问该信号量的新进程被创建时,它会获得句柄的副本。然后将该句柄传递给 sem_openCreateSemapohre ,并且操作系统授予新进程访问原始信号量的权限。

所以内存被共享的,但它是作为操作系统对同步原语的内置支持的一部分被共享的。也就是说,在这种情况下,你不需要开启一个新的进程来管理共享内存;操作系统接管该任务。但这是可能的,因为 Event 不需要比信号量更复杂的东西来工作。

关于Python multiprocessing.Process 对象的行为就像它持有对另一个进程中的对象的引用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16134496/

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