gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:34 24 4
gpt4 key购买 nike

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

最佳答案

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

在远程进程中,创建一个代理对象,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),sink 进程将关闭文件并退出。

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

关于Python:从多个进程写入单个文件(ZMQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18624516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com