2014-11-13 16 views
3

rpyc 서비스 내에서 멀티 프로세싱 패키지를 사용하려고하지만 클라이언트에서 노출 된 함수를 호출하려고하면 ValueError: pickling is disabled이 표시됩니다. multiprocesing 패키지는 절건을 사용하여 프로세스간에 정보를 전달하며 안전하지 않은 프로토콜이기 때문에 rpyc에 절임이 허용되지 않음을 알고 있습니다. 그래서 rpyc로 다중 처리를 사용하는 것이 가장 좋은 방법인지 (또는 어쨌든 존재한다면) 확신 할 수 없다. rpyc 서비스 내에서 다중 처리를 사용하려면 어떻게해야합니까? 여기RPYC로 다중 처리 Python "ValueError : pickling is disabled"

import rpyc 
from multiprocessing import Pool 

class MyService(rpyc.Service): 

    def exposed_RemotePool(self, function, arglist): 

     pool = Pool(processes = 8) 
     result = pool.map(function, arglist) 
     pool.close() 
     return result 


if __name__ == "__main__": 
    from rpyc.utils.server import ThreadedServer 
    t = ThreadedServer(MyService, port = 18861) 
    t.start() 

그리고 오류를 생성하는 클라이언트 측 코드입니다 :

import rpyc 

def square(x): 
    return x*x 

c = rpyc.connect("localhost", 18861) 
result = c.root.exposed_RemotePool(square, [1,2,3,4]) 
print(result) 
+0

http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when -using-pythons-multiprocessing-pool-ma? rq = 1 –

+0

개체는 일반적으로 절편 (단지 정수) 일 수 있지만 rpyc는 산세를 금지하고 산 세척을 사용하는 (겉으로보기에는) 다중 처리를 금지합니다. 새 프로토콜을 구현하지 않고 rpyc를 사용하려고합니다. 할 수 없다면 나는 다른 해결책을 찾겠지만 차라리 재발견하지 않겠다. 그렇게 할 수없는 경우 rpyc가 존재하는 이유, 즉 멀티 코어 컴퓨터에서 하나의 프로세서 만 사용할 수있는 경우 다른 컴퓨터를 사용하는 것이 무엇인지에 대해 분실했습니다. – Michael

+0

네트워크 환경에서 멀티 스레딩을 쉽게 수행 할 수없는 많은 이유가 있습니다. 그 중 하나는 CPU 할당이 커널 내부에서 이루어지고 사용자 공간 스레드 라이브러리가이 기능을 사용하도록 요청할 수 있다는 것입니다. 그러나 항상 보장되는 것은 아닙니다. 그리고 이것은 잘 알려져 있습니다 : http://intermediate-and-advanced-software-carpentry.readthedocs.org/en/latest/multiprocessing.html (GIL은 단일 쓰레드만큼 빠르게 다중 쓰레드를 만들고 "전역"잠금은 단일 호스트). –

답변

2

프로토콜 구성에서 산세를 활성화 할 수 있습니다. 구성은 사전으로 저장되며 default을 수정하여 서버 (protocol_config =)와 클라이언트 (config =) 모두에 전달할 수 있습니다. 또한 클라이언트와 서버 측에서 병렬 처리되는 함수를 정의해야합니다. 그래서 여기 server.py의 전체 코드는 다음과 같습니다

import rpyc 
from multiprocessing import Pool 
rpyc.core.protocol.DEFAULT_CONFIG['allow_pickle'] = True 

def square(x): 
    return x*x 


class MyService(rpyc.Service): 

    def exposed_RemotePool(self, function, arglist): 

     pool = Pool(processes = 8) 
     result = pool.map(function, arglist) 
     pool.close() 
     return result 



if __name__ == "__main__": 
    from rpyc.utils.server import ThreadedServer 
    t = ThreadedServer(MyService, port = 18861, protocol_config = rpyc.core.protocol.DEFAULT_CONFIG) 
    t.start() 

그리고 client.py의 코드는 다음과 같습니다

import rpyc 

rpyc.core.protocol.DEFAULT_CONFIG['allow_pickle'] = True 

def square(x): 
    return x*x 

c = rpyc.connect("localhost", port = 18861, config = rpyc.core.protocol.DEFAULT_CONFIG) 
result = c.root.exposed_RemotePool(square, [1,2,3,4]) 
print(result) 
0

당신은 프로토콜 구성에서 활성화해야 다음은 서버 측 코드입니다. http://rpyc.readthedocs.org/en/latest/api/core_protocol.html#rpyc.core.protocol.DEFAULT_CONFIG

+0

보안 관점에서 볼 때 이것은 좋은 생각입니까? – Michael

+0

상단에있는 코드에'rpyc.core.protocol.DEFAULT_CONFIG [ 'allow_pickle'] = True'를 추가했지만 오류가 계속 발생합니다. ThreadedServer 객체에 대해이 설정을 변경하는 방법을 모릅니다. – Michael