我正在学习如何从以下正式示例( 1、2 )中从不同的进程登录到同一个文件。
然后,我尝试了一个来自不同进程的日志记录的简单示例,但是没有遵循上面示例中建议的内容,即遵循通常的方式,而不考虑多进程日志记录场景:
码
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 )temp.log
[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不是真正创建一个新进程,而是创建一个新线程?
我在Windows 7 64位上运行Python3.6.4在cygwin上
发布于 2018-09-12 12:30:16
不支持并不意味着预期的行为会因错误而失败。这只意味着他们在这种情况下不会承诺表现和行为。
不支持可能还意味着,由于命名的技术复杂性,不希望尝试在所有类型的上下文中从多个进程中计算日志记录的结果。
这基本上意味着YMMV,如果您选择继续以这种方式进行日志记录,那么当您开始获得IO错误或错误日志时,不要给Python团队发电子邮件。它看起来很适合你,但是如果你想升级你的应用程序,或者把它移到不同的操作系统上,它可能以不同的方式处理文件IO,那就警告你.不支持此行为。
https://stackoverflow.com/questions/52294850
复制相似问题