多处理允许我在从同一个python运行时解释器中启动的进程之间共享数据。 但是,如果我需要在由单独的 python 运行时进程启动的进程之间共享数据怎么办? 我正在研究多处理。经理,这似乎是正确的结构。如果我创建一个经理,我可以看到它的地址:
>>> 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
如果我开始一个具有多处理的新进程。处理它会产生一个新的 python 解释器,该解释器以某种方式继承有关这些共享构造的信息,例如此管理器。 有没有办法从一个新的python进程访问它,而不是从创建管理器的同一个进程中生成的?
你走在(或a)正确的轨道上。
在评论中,stovfl建议查看Python多处理Manager
文档(Python2,Python3)的远程管理器部分。 正如你所观察到的,每个管理器都有一个可命名的实体(在本例中是/tmp
套接字),每个 Python 进程都可以通过该实体连接到对等 Python 进程。 但是,由于可以从任何进程访问它们,因此它们每个都有一个访问密钥。
每个管理器的默认键是"主进程"的默认键,它是一个由 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 的泡菜以获取有关此内容的更多信息。