首页 > 解决方案 > 为什么从不同进程登录到同一个文件有效,而文档说不应该?

问题描述

我正在学习如何从这些官方示例中的不同进程登录到同一个文件:12

然后我尝试了一个从不同进程进行日志记录的简单示例,但没有遵循上述示例中建议的内容,即按照通常的方式而不考虑多进程场景进行日志记录:

代码

import time
import multiprocessing as mup
import sys
import os
import logging

def worker(name):

    logging.basicConfig(
     filename='temp.log',
     level=logging.INFO, 
     filemode = 'a',
     format= '[%(asctime)s][%(levelname)s]: %(message)s')

    logger = logging.getLogger()

    a = 0

    while(a < 5):
        print(name,":",a)
        logger.info("{}: {}".format(name,a))
        a = a+1
        time.sleep(0.2)
        pass 

    print("Exiting worker: ", name, "(", os.getpid(), ")")

def start_server():
    b = 0

    while(b<3):
        new_worker = mup.Process(target=worker,args=('worker-'+str(b),))
        new_worker.daemon = True
        new_worker.start()
        b = b + 1

    time.sleep(3600)

start_server()

安慰

worker-0 : 0
worker-0 : 1
worker-1 : 0
worker-0 : 2
worker-1 : 1
worker-2 : 0
worker-0 : 3
worker-1 : 2
worker-2 : 1
worker-0 : 4
worker-1 : 3
worker-2 : 2
Exiting worker:  worker-0 ( 13300 )
worker-1 : 4
worker-2 : 3
Exiting worker:  worker-1 ( 13228 )
worker-2 : 4
Exiting worker:  worker-2 ( 11000 )

临时日志

[2018-09-12 17:28:21,442][INFO]: worker-0: 0
[2018-09-12 17:28:21,643][INFO]: worker-0: 1
[2018-09-12 17:28:21,655][INFO]: worker-1: 0
[2018-09-12 17:28:21,843][INFO]: worker-0: 2
[2018-09-12 17:28:21,855][INFO]: worker-1: 1
[2018-09-12 17:28:21,871][INFO]: worker-2: 0
[2018-09-12 17:28:22,044][INFO]: worker-0: 3
[2018-09-12 17:28:22,056][INFO]: worker-1: 2
[2018-09-12 17:28:22,071][INFO]: worker-2: 1
[2018-09-12 17:28:22,244][INFO]: worker-0: 4
[2018-09-12 17:28:22,256][INFO]: worker-1: 3
[2018-09-12 17:28:22,272][INFO]: worker-2: 2
[2018-09-12 17:28:22,456][INFO]: worker-1: 4
[2018-09-12 17:28:22,472][INFO]: worker-2: 3
[2018-09-12 17:28:22,672][INFO]: worker-2: 4

令人惊讶的是它正在工作。我认为在从不同进程登录到同一个文件时应该面临一些文件访问冲突。但这并没有发生。多处理包说明如下

尽管日志记录是线程安全的,并且支持在单个进程中从多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为没有标准方法可以在多个进程中序列化对单个文件的访问Python 中的进程。

它是否有效,因为在做

 new_worker.daemon = True

并没有真正创建一个新进程,而只是一个新线程?

我在 cygwin 上运行 Python 3.6.4 的 Windows 7 64 位

标签: pythonpython-3.xloggingmultiprocessing

解决方案


不支持并不意味着预期的行为会因错误而失败。这只是意味着他们不承诺在这些情况下的表现和行为。

不支持也可能意味着由于命名的技术复杂性,不希望尝试计算在所有类型的上下文中从多个进程进行日志记录的后果。

这基本上意味着 YMMV,如果您选择继续以这种方式登录,请不要在开始收到 IO 错误或乱码日志时向 Python 团队发送电子邮件。看起来它对您来说工作正常,但是如果您要扩展您的应用程序或将其移动到可能以不同方式处理文件 IO 的不同操作系统,那么请注意......不支持这种行为。


推荐阅读