[英]python multiprocessing sharing data between separate python processes
多处理允许我在同一个python运行时解释器中启动的进程之间共享数据。 但是如果我需要在由单独的python运行时进程启动的进程之间共享数据呢? 我在看multiprocessing.Manager,它似乎是正确的构造。 如果我创建一个经理,我可以看到它的地址:
>>> from multiprocessing import Manager
>>> m=Manager()
>>> m.address
'/tmp/pymp-o2TCd_/listener-Qld03B'
插座就在那里:
adrian@sammy ~/temp $ netstat -naA unix | grep pymp
unix 2 [ ACC ] STREAM LISTENING 1220401 /tmp/pymp- o2TCd_/listener-Qld03B
如果我使用multiprocessing.Process启动一个新进程,它会生成一个新的python解释器,它以某种方式继承有关这些共享结构的信息,如此Manager。 有没有办法从新的python进程访问它而不是从创建Manager的同一个进程中生成?
你正处于(或)正确的轨道上。
在评论中,stovfl建议查看Python多处理Manager
文档( Python2 , Python3 )的远程管理器部分。 正如您所观察到的,每个管理器都有一个可命名的实体(在本例中为/tmp
中的套接字),每个Python进程都可以通过它连接到对等的Python进程。 但是,因为它们可以从任何进程访问,所以它们每个都有一个访问密钥。
每个Manager的默认密钥是“主进程”的默认密钥,它是一个32个随机字节的字符串 :
class _MainProcess(BaseProcess):
def __init__(self):
self._identity = ()
self._name = 'MainProcess'
self._parent_pid = None
self._popen = None
self._config = {'authkey': AuthenticationString(os.urandom(32)),
'semprefix': '/mp'}
# Note that some versions of FreeBSD only allow named
# semaphores to have names of up to 14 characters. Therefore
# we choose a short prefix.
#
# On MacOSX in a sandbox it may be necessary to use a
# different prefix -- see #19478.
#
# Everything in self._config will be inherited by descendant
# processes.
但您可以指定自己的密钥,然后您可以知道这些密钥,因此可以在其他任何地方使用。
还有其他方法可以解决这个问题。 例如,您可以使用XML RPC从一个Python进程导出可调用函数,可以从任何可调用XML RPC的Python调用。 请参阅Python2或Python3文档。 注意这个警告(这是py3k变体,但它也适用于py2k):
警告 :
xmlrpc.client
模块对于恶意构造的数据不安全。 如果需要解析不受信任或未经身份验证的数据,请参阅XML漏洞。
但是,不要假设使用multiprocessing.Manager
而不是XML RPC可以保护您免受恶意构造的数据的侵害。 这些都是脆弱的,因为它们会破坏任意数据。 有关此内容的更多信息,请参阅攻击Python的pickle 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.