首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python MultiProcess、日志记录、各种类

Python MultiProcess、日志记录、各种类
EN

Stack Overflow用户
提问于 2013-07-11 06:38:47
回答 2查看 4.3K关注 0票数 0

我目前正在尝试从多个进程中记录到单个文件,但我遇到了很多问题。我花了无数的时间在网上寻找-- stackoverflow和谷歌,但没有找到任何具体的东西。

我读过:How should I log while using multiprocessing in Python?

我一直在尝试使用zzzeek的代码,但它不能为我写入文件。我没有具体的方法--我只是尝试了所有我能做到的方法。

你们中有没有人让它工作并且有示例代码,或者你们有替代的方法来做它。我需要将多个进程记录到同一个文件中。我还想将来自不同类的任何错误记录到同一个文件中。然而,我对简单地让多进程进程运行感到满意。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-11 06:56:12

看看这些帖子:

  1. Using logging with multiprocessing
  2. Improved QueueHandler, QueueListener: dealing with handlers that block
  3. logutils: Using recent logging features with older Python versions
票数 2
EN

Stack Overflow用户

发布于 2013-07-11 07:03:48

下面是一些使用zzzeek处理程序的示例代码:

代码语言:javascript
复制
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))

下面是我运行它的过程:

代码语言:javascript
复制
$ python mtlog.py
$ cat foo.log
Hi from 6179
Hi from 6180
Hi from 6181
Hi from 6182

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

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

不幸的是,这种方法在

上不起作用。来自docs.python.org/library/multiprocessing.html 16.6.2.12“请注意,在Windows上,子进程将只继承父进程的记录器级别-不会继承记录器的任何其他自定义设置。”子进程不会继承处理程序,并且您不能显式传递它,因为它是不可拾取的。

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

我认为这只指的是硬连接到多处理模块中的记录器。这个方法并没有利用这一点,也不应该关心日志级别的传播,它只是使用正常的多处理通道将数据从子进程传送到父进程。

这完全是一种倒退。日志级别的传播起作用;addHandler的传播不起作用。

要实现这一点,您需要显式地将queue传递给孩子,并在此基础上构建孩子端记录器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17582155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档