繁体   English   中英

Python多进程,日志记录,各种类

[英]Python MultiProcess, Logging, Various Classes

我目前正在尝试从多个进程登录到单个文件,但我遇到了很多麻烦。 我花了无数个小时在线查看 - stackoverflow和谷歌,但没有提出任何具体的建议。

我读过: 在Python中使用多处理时应该如何记录?

我一直在尝试使用zzzeek的代码,但它不会为我写入文件。 我没有具体的方式我这样做 - 我只是尽力而为。

有没有人让它工作并有示例代码,或者你有另一种方法可以做到这一点。 我需要将多个进程记录到同一个文件中。 我还想将各种类的错误记录到同一个文件中。 但是,我很满意简单地让多进程工作。

谢谢

这是一些与zzzeek的处理程序一起使用的示例代码:

mtlog = MultiProcessingLog('foo.log', 'a', 0, 0)
logging.getLogger().addHandler(mtlog)

def task(_):
    logging.error('Hi from {}'.format(os.getpid()))

p = multiprocessing.Pool()
p.map(task, range(4))

这是我的运行:

$ python mtlog.py
$ cat foo.log
Hi from 6179
Hi from 6180
Hi from 6181
Hi from 6182

事实上,我提出的任何微不足道的测试都可以。 很明显,在你的所有尝试中,你做错了,可能是同样的事情。


我的第一个猜测是你试图在Windows上使用它。 正如Noah Yetter的评论所说:

不幸的是,这种方法在Windows上不起作用。 来自docs.python.org/library/multiprocessing.html 16.6.2.12“请注意,在Windows子进程上只会继承父进程的记录器级别 - 不会继承记录器的任何其他自定义。” 子进程不会继承处理程序,也不能显式传递它,因为它不是pickleable。

虽然zzzeek回复说他认为它会起作用,但我90%肯定他错了:

我认为这只涉及硬连线到多处理模块的记录器。 这个配方没有使用它,也不关心loglevels的传播,它只是使用普通的多处理通道将数据从子节点传送到父节点。

那完全是落后的。 日志级别的传播确实有效; addHandler传播没有

要使其工作,您需要将queue显式传递给子节点,并构建子节点记录器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM