簡體   English   中英

python多處理在不同的python進程之間共享數據

[英]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文檔( Python2Python3 )的遠程管理器部分。 正如您所觀察到的,每個管理器都有一個可命名的實體(在本例中為/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調用。 請參閱Python2Python3文檔。 注意這個警告(這是py3k變體,但它也適用於py2k):

警告xmlrpc.client模塊對於惡意構造的數據不安全。 如果需要解析不受信任或未經身份驗證的數據,請參閱XML漏洞。

但是,不要假設使用multiprocessing.Manager而不是XML RPC可以保護您免受惡意構造的數據的侵害。 這些都是脆弱的,因為它們會破壞任意數據。 有關此內容的更多信息,請參閱攻擊Python的pickle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM