当前位置: 首页 > 面试题库 >

在Python中使用多重处理时应如何记录?

司寇昱
2023-03-14
问题内容

现在,我在框架中有一个中央模块,该模块使用Python 2.6 multiprocessing模块产生多个进程。由于使用multiprocessing,因此存在模块级的多处理感知日志LOG = multiprocessing.get_logger()。根据文档,此记录器具有进程共享的锁,因此你不会sys.stderr通过同时写入多个进程来乱码内容(或任何文件句柄)。

我现在遇到的问题是框架中的其他模块不支持多处理。以我的方式看,我需要使这个中央模块上的所有依赖项都使用支持多处理的日志记录。在框架内这很烦人,更不用说框架的所有客户了。有我没有想到的替代方法吗?


问题答案:

现在,它使用队列来正确处理并发,并且还可以从错误中正确恢复。我现在已经在生产中使用它几个月了,下面的当前版本可以正常工作。

from logging.handlers import RotatingFileHandler
import multiprocessing, threading, logging, sys, traceback

class MultiProcessingLog(logging.Handler):
    def __init__(self, name, mode, maxsize, rotate):
        logging.Handler.__init__(self)

        self._handler = RotatingFileHandler(name, mode, maxsize, rotate)
        self.queue = multiprocessing.Queue(-1)

        t = threading.Thread(target=self.receive)
        t.daemon = True
        t.start()

    def setFormatter(self, fmt):
        logging.Handler.setFormatter(self, fmt)
        self._handler.setFormatter(fmt)

    def receive(self):
        while True:
            try:
                record = self.queue.get()
                self._handler.emit(record)
            except (KeyboardInterrupt, SystemExit):
                raise
            except EOFError:
                break
            except:
                traceback.print_exc(file=sys.stderr)

    def send(self, s):
        self.queue.put_nowait(s)

    def _format_record(self, record):
        # ensure that exc_info and args
        # have been stringified.  Removes any chance of
        # unpickleable things inside and possibly reduces
        # message size sent over the pipe
        if record.args:
            record.msg = record.msg % record.args
            record.args = None
        if record.exc_info:
            dummy = self.format(record)
            record.exc_info = None

        return record

    def emit(self, record):
        try:
            s = self._format_record(record)
            self.send(s)
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)

    def close(self):
        self._handler.close()
        logging.Handler.close(self)


 类似资料:
  • 问题内容: 我正在尝试使用的功能同时划分工作。当我使用以下代码时,它可以正常工作: 但是,当我以更加面向对象的方式使用它时,它将无法正常工作。它给出的错误信息是: 这是我的课: 任何人都知道问题可能是什么,或解决问题的简单方法? 问题答案: 问题在于,多处理必须使进程中的东西腌制,而绑定的方法却不能腌制。解决方法(无论你是否认为它“容易” 是向你的程序中添加基础结构,以允许对这些方法进行腌制,并使

  • 问题内容: 在效率和代码清晰性方面,决定使用线程或多处理时应遵循哪些良好准则? 问题答案: 线程和多处理之间的许多差异并不是真正针对Python的,某些差异特定于某个Python实现。 对于CPython,在以下情况下,我都将使用该模块: 由于性能原因,我需要同时使用多个内核。使用线程时,全局解释器锁(GIL)将阻止任何加速。(无论如何,有时在这种情况下您都可以避免使用线程,例如,当主要工作是在通

  • 问题内容: 我在使用Python进行面向对象的编程方面非常陌生,并且在理解函数(新样式类)时遇到困难,特别是在涉及多重继承时。 例如,如果你有类似的东西: 我不明白的是:该类会继承两个构造函数方法吗?如果是,那么哪个将与一起运行,为什么? 而如果要运行另一个呢?我知道这与Python方法解析顺序有关。 问题答案: Guido自己在他的博客文章(包括两次较早的尝试)中对此进行了合理的详细说明。 在你

  • 问题内容: 最初,我有一个类来存储一些处理后的值,并将其与其他方法重用。 问题是,当我尝试将类方法划分为多个进程以加快速度时,python生成了进程,但它似乎不起作用(正如我在“任务管理器”中看到的那样,只有1个进程在运行)并且结果从未交付。 我进行了几次搜索,发现pathos.multiprocessing可以代替它,但是我想知道标准库是否可以解决这个问题? 问题答案: 您的代码失败了,因为它无

  • 问题内容: 我正在开发一个本机android应用程序,其中尝试使用2个开源库。问题是两个库都在各自的库中使用应用程序类。他们正在使用application标签下的“ android:name”在清单文件的相应源代码中注册这些类。问题是如何处理这种情况,因为众所周知,清单文件中只能使用ONE标签。我们是否可以在代码中注册/实例化应用程序类,以便我们在标记中仅提及一个库,而在代码中/实用地提及第二个库

  • 问题内容: 在我的组件中,我具有以下内容: 不调用取消订阅会导致以下错误: 警告:setState(…):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState()。这是无人值守。 我想知道的是我应该分配给它,还是有更好的分配空间? 问题答案: 正如Salehen Rahman在上面的评论中提到的,我最终还是使用react-redux。 根据他们的文档,我创建了两个函