python - 为什么从不同进程登录到同一个文件有效,而文档说不应该?
问题描述
我正在学习如何从这些官方示例中的不同进程登录到同一个文件: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 )
临时日志
[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 位
解决方案
不支持并不意味着预期的行为会因错误而失败。这只是意味着他们不承诺在这些情况下的表现和行为。
不支持也可能意味着由于命名的技术复杂性,不希望尝试计算在所有类型的上下文中从多个进程进行日志记录的后果。
这基本上意味着 YMMV,如果您选择继续以这种方式登录,请不要在开始收到 IO 错误或乱码日志时向 Python 团队发送电子邮件。看起来它对您来说工作正常,但是如果您要扩展您的应用程序或将其移动到可能以不同方式处理文件 IO 的不同操作系统,那么请注意......不支持这种行为。
推荐阅读
- apache - .htaccess 如何加载重写页面而不是重定向
- java - 此 HQL 查询不适用于元素或成员,但本机查询可以
- python - 检查数千个 EC2 实例是否有快照的有效方法?
- javascript - 当我在 src 中添加图像时,Bootstrap Carousel 不起作用
- reactjs - 处理多个表单输入
- c++ - 如何深度复制具有非平凡数据成员的结构
- angular - 如何从 IE 11 (Angular 8) 中删除“google”未定义错误?
- ios - 列表未在 swiftUI 中加载。更新
- python - 如何停止在 Django 中执行两次的基于类的视图的 __init__?
- ms-access - 访问对象图像大小