1

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

4

1 回答 1

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 或使接收器稍微复杂一些并使用多部分消息来指示要写入的文件来相当容易地做到这一点。

于 2013-09-04T22:52:02.400 回答