2014-05-12 4 views
0

IPC 용 ZeroMQ를 사용합니다. 한 프로세스가 소켓 (파이프 또는 유닉스 소켓?)을 청취하고 다른 프로세스가 기록 할 때 완벽하게 작동합니다. 수신프로세서 간 통신, 하나의 프로세서 쓰기, 다른 읽기

응용 :

context = zmq.Context.instance() 
sock = context.socket(zmq.REQ) 
sock.bind('ipc:///tmp/myapp') 
sock.send('foo') 
response = sock.recv() 
print response 

것은 내가 내 응용 프로그램의 여러 노동자 (프로세스)를 실행할 필요가 있습니다 :

... 
listener = IPCListener() 
listener.startup_thread = Thread(target=listener.serve) 
listener.startup_thread.daemon = True 
listener.startup_thread.start() 

class IPCListener() 

    def __init__(self) 
     self.context = zmq.Context.instance() 
     self.sock = self.context.socket(znq.REP) 
     self.sock.connection('ipc:///tmp/myapp') 

    def serve(self): 
     while True: 
      message = self.sock.recv() 
      response = self.handle_message(message) 
      self.sock.send(response) 

    def handle_message(self, message): 
     if message == 'foo': 
      do_something_useful() 

여기에는 관리자입니다. 내가 'sock.error: [Error 98] Already in use'

내가 여러 프로세스를 만들 수있는 방법은 하나 개의 공통 소켓을 읽을이 있는지 모르겠어요를 얻을 말할 필요도 없죠? zmq로는 불가능할 수도 있지만, 이것을 처리 할 수있는 것은 무엇입니까?

+0

모든 프로세스가 동일한 연결 'ipc : /// tmp/myapp'을 사용합니까? 그게 문제 같아. 이 파일은 실제로 생성/잠금 될 수 있습니다. 'ipc : // tmp/myapp- % d "% os.getpid() 파일이나 프로세스마다 다른 파일을 만들어 동일한 파일을 다시 사용하지 않도록하십시오. – FrobberOfBits

+0

이게 의미가 있지만, , 더 간단한 접근 – KennyPowers

답변

0

이 처리하는 일반적인 방법은 메인 프로세스/스레드가 소켓에서 수신하는 것입니다, 다음은 작업자 프로세스 중 하나 떨어져 메시지, 손 처리를 얻으면.

+0

흠, 나는 그것이 불가능하다고 생각합니다. 나는 많은 사람들을 uWSGI와 함께 운영합니다. – KennyPowers