【发布时间】:2020-08-07 10:39:26
【问题描述】:
如题,我想要一个log rpc server来帮我处理新进程中的log。
我参考 zerorpc 和这个链接: https://stackoverflow.com/a/57140017/14021161
但陷入了一个奇怪的错误
代码:
import zerorpc
from loguru import logger
import time
import multiprocessing as mp
import collections
Job = collections.namedtuple('Job', ['event', 'args'])
class LogClient(mp.Process):
"""A process backed by an internal queue for simple one-way message passing.
"""
def __init__(self, ip='127.0.0.1', port='4242'):
super().__init__()
self.queue = mp.Queue()
self.c = zerorpc.Client()
address = f"tcp://{ip}:{port}"
self.c.connect(address)
self.start()
def put(self, event, *args):
"""Puts the event and args as a `Job` on the queue
"""
job = Job(event, args)
self.queue.put(job)
def _addLog(self, job):
event, args = job
self.c.addLog(*args)
def run(self):
while True:
job = self.queue.get()
self._addLog(job)
def addLog(self, level, *context):
self.put('addLog', level, *context)
lc = LogClient()
lc.c.addLog("WARNING", 'hello', 'Ray') # this work, but its witout multiprocess
lc.addLog("INFO", 'hello', 'Ray') # doesn't work
lc.terminate()
_addLog 确实收到了作业,但并没有真正将其发送到服务器
任何建议将不胜感激!提前致谢。
|
|
附言为了让问题更清楚,我只显示addLog,但实际上服务器应该处理许多IO作业。
所以_addLog func 会变成dispatch func 和gettattr 来解析服务器中的所有函数
【问题讨论】:
-
zerorpc 使用 gevent 来复用 I/O。 gevent 通过单线程上的 couroutines 提供异步操作。除此之外,zmq 不能很好地使用 forks(zmq 使用线程。用线程进行 forking 是不可能的)。我不会对此感到惊讶,因为 gevent 或 zmq 都处于死锁状态。看看gevent,看看能不能用它来代替multiprocess。
标签: python multiprocessing zeromq getattr zerorpc