Python:从多个进程写入单个文件(ZMQ)

时间:2013-09-04 21:59:51

标签: python zeromq pyzmq

我想从多个进程写入单个文件。确切地说,我宁愿不使用Multiple processing Queue solution进行多处理,因为有几个子模块由其他开发人员编写。但是,对此类子模块的每次写入都与写入zmq队列相关联。有没有办法可以将zmq消息重定向到文件?具体来说,我正在寻找http://www.huyng.com/posts/python-logging-from-multiple-processes/行的内容而不使用logging模块。

1 个答案:

答案 0 :(得分:5)

这很简单。在一个过程中,绑定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

在远程进程中,创建一个Proxy对象, 其write方法只是通过zmq发送消息:

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)

而且,只是为了好玩,如果你拨打Proxy.write(EOF),接收过程将关闭文件并退出。

如果你想写多个文件,你可以通过启动多个接收器并且每个文件有一个URL来相当容易地做到这一点, 或者使接收器稍微复杂一些,并使用多部分消息来指示要写入的文件。