为什么在文档说不应该从不同进程登录到同一文件的情况下起作用?

时间:2018-09-12 12:10:08

标签: python python-3.x logging multiprocessing

我正在学习如何从这些官方示例: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

令人惊讶的是它在工作。我以为从不同进程登录到同一文件时应该遇到一些文件访问冲突。但这没有发生。多处理程序包says following

  

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

因为这样做

 new_worker.daemon = True

不是真的创建了一个新进程,而是一个新线程?

我在Windows 7 64位系统上,在cygwin上运行Python 3.6.4

1 个答案:

答案 0 :(得分:2)

不受支持并不意味着预期的行为将因错误而失败。这仅表示他们在这种情况下不保证表现和行为。

不受支持还可能意味着由于命名上的技术复杂性,在各种类型的上下文中尝试找出来自多个进程的日志记录的后果是不可取的。

这基本上是YMMV的意思,如果您选择继续以这种方式登录,则在开始出现IO错误或日志乱码时不要给Python团队发送电子邮件。看起来它对您来说运行良好,但是如果您要扩展应用程序或将其移至可能以不同方式处理文件IO的其他操作系统,则将被警告...不支持此行为。