2017-05-07 28 views
1

マルチプロセッシングを使用すると、同じPython実行時インタープリタ内から開始されたプロセス間でデータを共有できます。 しかし、別のPythonランタイムプロセスによって開始されたプロセス間でデータを共有する必要がある場合はどうすればよいですか? 私はそれのための正しい構成であると思われるmultiprocessing.Managerを見ていました。私はmultiprocessing.Processで新しいプロセスを起動した場合、それは何らかの形で継承する新しいPythonインタプリタを起動します別のPythonプロセス間でデータを共有するPythonマルチプロセッシング

[email protected] ~/temp $ netstat -naA unix | grep pymp 
unix 2  [ ACC ]  STREAM  LISTENING  1220401 /tmp/pymp-  o2TCd_/listener-Qld03B 

>>> from multiprocessing import Manager 
>>> m=Manager() 
>>> m.address 
'/tmp/pymp-o2TCd_/listener-Qld03B' 

とソケットがあります:私はマネージャーを作成する場合、私はそのアドレスを見ることができますこのマネージャのような共有構造に関する情報 Managerを作成したのと同じものから生成されない新しいPythonプロセスからその方法にアクセスする方法はありますか?

+0

「RemoteManager」について:https://docs.python.org/3/library/multiprocessing.html#using-a-remote-manager – stovfl

答えて

0

あなたはこれで(または)正しいトラックにいます。

a comment, stovfl suggestsManagerのマニュアル(Python2Python3)のリモートマネージャのセクションを参照してください。ご存知のように、各マネージャは、名前付きのエンティティ(ここでは/tmpのソケット)を持っています。これにより、各Pythonプロセスがピアツーピアプロセスに接続できます。ただし、これらはすべてのプロセスからアクセスできるため、それぞれにアクセスキーがあります。

各Managerのデフォルトのキーは、「メインプロセス」の一つであり、そしてそれはa string of 32 random bytes次のとおりです。

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. 

しかし、あなたはあなたが知ることができ、独自のキーを割り当てるので、どこからでも使用することができますelse。

これを処理する他の方法があります。たとえば、XML RPCを使用して、呼び出し可能な関数を、PythonだけでなくXML RPCを使用できる何かから呼び出せる、あるPythonプロセスからエクスポートすることができます。 Python2またはPython3のドキュメントを参照してください。 (これはpy3k変異体であるが、それは同様にpy2kに適用)この警告に注意:

警告:xmlrpc.clientモジュールは悪意を持って構築されたデータに対して安全ではありません。信頼できないデータまたは認証されていないデータを解析する必要がある場合は、XMLの脆弱性を参照してください。

ただし、XML RPCの代わりにmultiprocessing.Managerを使用すると、悪意のあるように構成されたデータからユーザーを保護することはできません。それらは任意のデータをunpickleするので、同様に脆弱です。詳細については、Attacking Python's pickleを参照してください。

関連する問題