Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多进程日志记录到共享文件_Python_Logging_Multiprocessing - Fatal编程技术网

Python多进程日志记录到共享文件

Python多进程日志记录到共享文件,python,logging,multiprocessing,Python,Logging,Multiprocessing,我使用多处理框架创建了几个并行子进程(通过JoinableQueue),但我只是在主线程中设置了日志记录(使用普通的python日志记录模块)。当我测试代码时,似乎所有子进程都能够将它们的日志放入我在主进程开始时指定的单个日志文件中,而不会出现任何问题 然而,根据,它说模块日志记录只是线程安全的,而不是进程安全的。建议使用: multiprocessing.logging(不具有的全部功能) 伐木) 使用mutliprocessing.Lock将连接序列化为 来自子进程的日志文件 使用loggi

我使用多处理框架创建了几个并行子进程(通过JoinableQueue),但我只是在主线程中设置了日志记录(使用普通的python日志记录模块)。当我测试代码时,似乎所有子进程都能够将它们的日志放入我在主进程开始时指定的单个日志文件中,而不会出现任何问题

然而,根据,它说模块日志记录只是线程安全的,而不是进程安全的。建议使用:

  • multiprocessing.logging(不具有的全部功能) 伐木)
  • 使用mutliprocessing.Lock将连接序列化为 来自子进程的日志文件
  • 使用logging.QueueHandler将日志发送到 一个多处理队列,然后有一个专用的登录线程 处理将日志记录写入日志文件的主要过程
  • 所有建议的解决方案对我来说都是有意义的,而且我实际上能够实施解决方案#3——它奏效了,没有问题


    但是,我确实有一个问题,如果我们处理得不好,会出现什么问题。如果我不做#1,2,3中的任何一项(如我在第一段中所述),会发生什么不良后果?我怎样才能使这些不良后果发生(我很想看到它们)?

    通常,您希望以某种方式进行日志写入。也就是说,在这种情况下,当有人将文本块写入日志时,该文本块将一起出现,而不是被拆分并与其他日志条目的内容混合。如果多个进程试图在没有某种中介的情况下写入一个文件,可能会导致内容的混合甚至混乱


    为了故意造成这种情况,让多个进程重复地同时写入日志,而无需中介(无锁或处理进程),正如文档所建议的那样。进程越多,写入的时间越长(部分取决于缓冲区大小),就越有可能混合。

    谢谢(+1)@Ouroboros,所以当你说混合时,你是指以下内容吗?假设子流程A将“AAAAA”写入日志文件,而子流程B将“BBBBB”写入日志文件;如果有控制,我们可能会得到一个包含“abababba”内容的日志文件?@YujieZha是的,但是,由于缓冲,数据块往往更大。