ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Python multiprocessing.Process对象的行为类似于在另一个进程中保存对对象的引用.为什么?

2019-10-31 00:56:13  阅读:288  来源: 互联网

标签:multiprocessing shared-memory python process


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()在进程之间共享对象,但是这怎么可能呢?

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

解决方法:

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

如果您花一些时间浏览多处理源,则可以看到它是如何工作的.您将看到一个Event对象使用一个Semaphore和一个Condition,它们都依赖于SemLock对象提供的锁定行为.反过来,这包装了_multiprocessing.SemLock对象,该对象在c中实现,并且取决于sem_open(POSIX)或CreateSemaphore(Windows).

这些是c函数,可以访问由操作系统本身(在本例中为信号灯)管理的共享资源.它们可以在线程或进程之间共享;操作系统负责一切.发生的情况是,在创建新的信号量时,将为其指定一个句柄.然后,在创建需要访问该信号量的新进程时,将为其提供一个句柄的副本.然后,它将该句柄传递给sem_openCreateSemapohre,并且操作系统为新进程提供对原始信号量的访问权限.

因此,内存是共享的,但作为操作系统对同步原语的内置支持的一部分而被共享.换句话说,在这种情况下,您无需打开新进程即可管理共享内存.操作系统接管该任务.但这仅是可行的,因为Event不需要比信号量更复杂的东西来工作.

标签:multiprocessing,shared-memory,python,process
来源: https://codeday.me/bug/20191031/1972096.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有