2017-05-07 5 views
1

멀티 프로세싱을 사용하면 동일한 파이썬 런타임 인터프리터에서 시작된 프로세스간에 데이터를 공유 할 수 있습니다. 하지만 별도의 파이썬 런타임 프로세스에서 시작된 프로세스간에 데이터를 공유해야하는 경우 어떻게해야합니까? 나는 그것을 위해 올바른 구조 인 것처럼 보이는 multiprocessing.Manager를보고있었습니다. 내가 관리자를 만들 경우 나는 그것의 주소를 볼 수 있습니다파이썬 다중 프로세싱 공유 파이썬 프로세스 간 데이터 공유

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

을 그리고 소켓이있다 : 나는 multiprocessing.Process와 새로운 프로세스를 시작하는 경우

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

은 어떻게 든 상속 새로운 파이썬 인터프리터를 생성합니다 이 Manager와 같은 공유 구성에 대한 정보. Manager를 생성 한 동일한 파이썬 프로세스에서 생성하지 않은 새로운 파이썬 프로세스에서이 방법에 액세스 할 수 있습니까?

+0

'RemoteManager'에 대한 정보 : https://docs.python.org/3/library/multiprocessing.html#using-a-remote-manager – stovfl

답변

0

당신은 (또는) 올바른 길을 가고 있습니다.

a comment, stovfl suggestsManager 설명서 (Python2, Python3)의 원격 관리자 섹션을 살펴보십시오. 이미 보았 듯이 각 관리자는 이름이 가능한 엔티티 (이 경우 /tmp의 소켓)를 통해 각 파이썬 프로세스가 피어 파이썬 프로세스에 연결할 수 있습니다. 그러나 이들은 프로세스에서 액세스 할 수 있기 때문에 각각 액세스 키가 있습니다.

각 관리자의 기본 키는 "기본 과정"의 하나이며, 그것은 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. 

하지만 당신은 당신이 다음 알 수 있습니다 자신의 키를 할당하기 때문에 어디서나 사용할 수 있습니다 그밖에.

다른 방법으로 처리 할 수 ​​있습니다. 예를 들어, XML RPC를 사용하여 Python뿐만 아니라 XML RPC를 말할 수있는 호출 가능한 함수를 호출 할 수 있습니다. Python2 또는 Python3 설명서를 참조하십시오. (이것은 py3k 변종이지만, 그것뿐만 아니라 py2k에 적용)이 경고에주의를 기울이지 :

을 경고 : xmlrpc.client 모듈은 악의적으로 구성된 데이터에 대해 안전하지 않습니다. 신뢰할 수 없거나 인증되지 않은 데이터를 구문 분석해야하는 경우 XML 취약성을 참조하십시오.

그러나 XML RPC 대신 multiprocessing.Manager을 사용하면 악의적으로 생성 된 데이터로부터 사용자를 보호한다고 가정하지 마십시오. 그것들은 임의의 데이터를 unpickle 처리 할 것이기 때문에 마찬가지로 취약합니다. 이에 대한 자세한 내용은 Attacking Python's pickle을 참조하십시오.