我目前正在尝试从多个进程中记录到单个文件,但我遇到了很多问题。我花了无数的时间在网上寻找-- stackoverflow和谷歌,但没有找到任何具体的东西。
我读过:How should I log while using multiprocessing in Python?
我一直在尝试使用zzzeek的代码,但它不能为我写入文件。我没有具体的方法--我只是尝试了所有我能做到的方法。
你们中有没有人让它工作并且有示例代码,或者你们有替代的方法来做它。我需要将多个进程记录到同一个文件中。我还想将来自不同类的任何错误记录到同一个文件中。然而,我对简单地让多进程进程运行感到满意。
谢谢
发布于 2013-07-11 06:56:12
看看这些帖子:
发布于 2013-07-11 07:03:48
下面是一些使用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的评论所说:
不幸的是,这种方法在
上不起作用。来自docs.python.org/library/multiprocessing.html 16.6.2.12“请注意,在Windows上,子进程将只继承父进程的记录器级别-不会继承记录器的任何其他自定义设置。”子进程不会继承处理程序,并且您不能显式传递它,因为它是不可拾取的。
虽然zzzeek回答说他认为它会起作用,但我90%确定他错了:
我认为这只指的是硬连接到多处理模块中的记录器。这个方法并没有利用这一点,也不应该关心日志级别的传播,它只是使用正常的多处理通道将数据从子进程传送到父进程。
这完全是一种倒退。日志级别的传播起作用;addHandler的传播不起作用。
要实现这一点,您需要显式地将queue传递给孩子,并在此基础上构建孩子端记录器。
https://stackoverflow.com/questions/17582155
复制相似问题