首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么从不同进程登录到同一个文件可以工作,而文档说不应该这样做呢?

为什么从不同进程登录到同一个文件可以工作,而文档说不应该这样做呢?
EN

Stack Overflow用户
提问于 2018-09-12 12:10:08
回答 1查看 63关注 0票数 0

我正在学习如何从以下正式示例( 12 )中从不同的进程登录到同一个文件。

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

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

控制台

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

temp.log

代码语言:javascript
复制
[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中没有标准的方法来序列化对单个文件的访问。

所以它起作用是因为

代码语言:javascript
复制
 new_worker.daemon = True

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

我在Windows 7 64位上运行Python3.6.4在cygwin上

EN

回答 1

Stack Overflow用户

发布于 2018-09-12 12:30:16

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

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

这基本上意味着YMMV,如果您选择继续以这种方式进行日志记录,那么当您开始获得IO错误或错误日志时,不要给Python团队发电子邮件。它看起来很适合你,但是如果你想升级你的应用程序,或者把它移到不同的操作系统上,它可能以不同的方式处理文件IO,那就警告你.不支持此行为。

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

https://stackoverflow.com/questions/52294850

复制
相关文章

相似问题

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