2013-09-04 2 views
0

여러 프로세스의 단일 파일에 쓰기를 원합니다. 정확히 말하자면 다른 개발자가 작성한 여러 개의 서브 모듈이 있으므로 다중 처리를 위해 Multiple processing Queue solution을 사용하지 않을 것입니다. 그러나 이러한 서브 모듈에 대한 파일에 대한 각각의 쓰기는 zmq 대기 행렬에 대한 쓰기와 연관됩니다. zmq 메시지를 파일로 리디렉션 할 수있는 방법이 있습니까? 특히 logging 모듈을 사용하지 않고 http://www.huyng.com/posts/python-logging-from-multiple-processes/ 줄을 찾고 있습니다.Python : 여러 프로세스 (ZMQ)에서 단일 파일에 쓰기

답변

4

상당히 간단합니다. 한 프로세스에서 PULL 소켓을 바인드하고 파일을 엽니 다. PULL 소켓이 메시지를 수신 할 때마다 파일에 직접 씁니다. 원격 프로세스에서

EOF = chr(4) 
import zmq 

def file_sink(filename, url): 
    """forward messages on zmq to a file""" 
    socket = zmq.Context.instance().socket(zmq.PULL) 
    socket.bind(url) 
    written = 0 
    with open(filename, 'wb') as f: 
     while True: 
      chunk = socket.recv() 
      if chunk == EOF: 
       break 
      f.write(chunk) 
      written += len(chunk) 

    socket.close() 
    return written 

, 단지 zmq를 통해 메시지를 전송 쓰기 방법 프록시 개체를 만들 : 당신이 Proxy.write(EOF)를 호출하는 경우, 그냥 재미,

class FileProxy(object): 
    """Proxy to a remote file over zmq""" 
    def __init__(self, url): 
     self.socket = zmq.Context.instance().socket(zmq.PUSH) 
     self.socket.connect(url) 

    def write(self, chunk): 
     """write a chunk of bytes to the remote file""" 
     self.socket.send(chunk) 

와 싱크 프로세스는 것입니다 파일을 닫고 종료하십시오.

여러 파일을 작성하려는 경우 여러 싱크를 시작하고 파일 당 URL을 하나씩 두거나 ( ) 싱크를 약간 더 정교하게 만들고 여러 부분 메시지를 사용하여 어떤 파일을 작성할지 나타낼 수 있습니다 .

관련 문제