来自多个进程的 Python 日志记录

2024-01-20

我有一个可能长时间运行的程序,当前有 4 个进程,但可以配置为有更多进程。我研究过从多个进程记录 http://docs.python.org/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes使用Python的logging并正在使用讨论的 SocketHandler 方法here http://docs.python.org/howto/logging-cookbook.html#sending-and-receiving-logging-events-across-a-network。我从来没有遇到过使用单个记录器(没有套接字)的任何问题,但从我读到的内容来看,我被告知它最终会意外失败。据我了解,当您尝试同时写入同一个文件时,未知会发生什么。我的代码基本上执行以下操作:

import logging
log = logging.getLogger(__name__)

def monitor(...):
    # Spawn child processes with os.fork()
    # os.wait() and act accordingly

def main():
    log_server_pid = os.fork()
    if log_server_pid == 0:
        # Create a LogRecordSocketServer (daemon)
        ...
        sys.exit(0)
    # Add SocketHandler to root logger
    ...
    monitor(<configuration stuff>)

if __name__ == "__main__":
    main()

所以我的问题是:我需要创建一个新的log每个之后的对象os.fork()?现有的全球格局会发生什么变化log object?

按照我的方式做事,我是否可以解决我试图避免的问题(多个打开的文件/套接字)?这会失败吗?为什么会失败(我想知道未来类似的实现是否会失败)?

另外,“正常”(一log=表达式)从多个进程记录到一个文件的方法失败?它会引发 IOError/OSError 吗?或者它只是没有将数据完全写入文件?

如果有人可以提供答案或链接来帮助我,那就太好了。谢谢。

FYI: 我正在 Mac OS X Lion 上进行测试,代码最终可能会在 Windows 计算机上的 CentOS 6 VM 上运行(如果这很重要的话)。无论我使用什么解决方案都不需要在 Windows 上工作,但应该在基于 Unix 的系统上工作。

UPDATE:这个问题已经开始不再记录特定行为,而更多地涉及 Linux 在分叉期间如何处理文件描述符的领域。我拿出一本大学教科书,似乎如果您从两个进程(而不是在分叉之前)以附加模式打开一个文件,只要您的写入不超过,它们都将能够正确写入该文件实际的内核缓冲区(尽管可能需要使用行缓冲,但仍不确定)。这将创建 2 个文件表条目和 1 个 v 节点表条目。打开文件然后分叉不应该起作用,但只要您不像以前那样超出内核缓冲区(我在之前的程序中已经这样做了),它似乎就可以工作。

所以我想,如果你想要独立于平台的多处理日志记录,你可以使用套接字并在每个分叉后创建一个新的 SocketHandler 以保证安全,正如 Vinay 下面建议的那样(这应该在任何地方都有效)。对我来说,由于我对运行软件的操作系统有很强的控制权,所以我想我会选择一个全局的log带有 FileHandler 的对象(默认以附加模式打开,并且在大多数操作系统上进行行缓冲)。的文档open http://docs.python.org/library/functions.html#open说“负缓冲意味着使用系统默认值,通常对 tty 设备是行缓冲,对其他文件是完全缓冲。如果省略,则使用系统默认值。”或者我可以创建自己的日志流以确保行缓冲。需要明确的是,我同意:

# Process A
a_file.write("A\n")
a_file.write("A\n")
# Process B
a_file.write("B\n")

生产...

A\n
B\n
A\n

只要不产生...

AB\n
\n
A\n

Vinay(或其他任何人),我错了多少?让我知道。感谢您提供更多的清晰度/确定性。


我需要在每个 os.fork() 之后创建一个新的日志对象吗?现有的全局日志对象会发生什么情况?

据我所知,全局日志对象仍然指向父进程和子进程中的同一个记录器。所以你不需要创建一个新的。但是,我认为您应该创建并添加SocketHandler之后fork() in monitor(),这样套接字服务器就有四个不同的连接,每个子进程一个连接。如果不这样做,那么在 Monitor() 中分叉的子进程将从其父进程继承 SocketHandler 及其套接字句柄,但我不确定它是否会出现异常行为。该行为可能取决于操作系统,并且您在 OSX 上可能很幸运。

按照我的方式做事,我是否可以解决我试图避免的问题(多个打开的文件/套接字)?这会失败吗?为什么会失败(我想知道未来类似的实现是否会失败)?

如果您在最后一个之后创建到套接字服务器的套接字连接,我不会期望失败fork()正如我上面所建议的,但我不确定在任何其他情况下该行为是否得到明确定义。您引用了多个打开的文件,但我在伪代码片段中没有看到打开文件的引用,只是打开套接字。

另外,从多个进程记录到一个文件的“正常”(一个日志=表达式)方法会以何种方式失败?它会引发 IOError/OSError 吗?或者它只是没有将数据完全写入文件?

我认为这种行为没有明确定义,但人们期望故障模式以来自文件中不同进程的散布日志消息的形式呈现,例如

Process A writes first part of its message
Process B writes its message
Process A writes second part of its message

Update:如果您使用FileHandler按照您在评论中描述的方式,由于我上面描述的情况,事情不会那么好:进程 A 和 B 都开始指向文件末尾(因为追加模式),但此后事情可以不同步是因为(例如,在多处理器上,但甚至可能在单处理器上),一个进程可以(抢占另一个进程)在另一个进程完成之前写入共享文件句柄。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自多个进程的 Python 日志记录 的相关文章

  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • python - 是否可以扩展 xml-rpc 可以序列化的事物集?

    我看到几个问题询问如何发送numpy ndarray通过 xml rpc 调用 这不能开箱即用 因为正如 xml rpc 中所述docs https docs python org 2 library xmlrpclib html 有一组固
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 如何限制Django CreateView中ForeignKey字段的选择?

    我有一个沿着这些思路的模型结构 models py class Foo models Model class Bar models Model foo models ForeignKey Foo class Baz models Model
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 如何通过双击在浏览器中打开 ipynb 文件

    以前 我安装了 Canopy 当时 我只需双击 ipynb 文件并在浏览器中打开它们即可 但是 后来我需要Anaconda 一旦我安装了它 这个功能就没有了 现在我只希望能够简单地双击 ipynb 文件 然后该文件就会在 Firefox 中
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • Matplotlib Scatter - ValueError:RGBA 序列的长度应为 3 或 4

    我正在尝试为我的功能绘制图表 但不断收到此错误 ValueError RGBA sequence should have length 3 or 4 每当我只有 6 种形状时 代码就可以完美运行 但现在我将其增加到 10 种 它就不起作用了
  • 如何通过字符串匹配加速 pandas 行过滤?

    我经常需要过滤 pandas 数据框df by df df col name string value 并且我想加快行选择操作 有没有快速的方法可以做到这一点 例如 In 1 df mul df 3000 2000 3 reset inde
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Python 3.2 中 **kwargs 和 dict 有什么区别?

    看起来Python的很多方面都只是功能的重复 除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外 还有什么区别吗 参数解包存在差异 许多人使用kwargs 并通过dict作为论据之一 使用参数解包 Prepare f
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代
  • 如何禁止 celery 中的 pickle 序列化

    Celery 默认使用 pickle 作为任务的序列化方法 如中所述FAQ http ask github com celery faq html isn t using pickle a security concern 这代表一个安全漏
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐

  • 以编程方式切换复选框

    我有一个需要检查 不可检查的项目的 ListView 我已经设置了一个 ArrayAdapter 当前使用 android R layout simple list item multiple choice 作为行 并且所有内容都显示得很好
  • 如何使用 Javascript 获取网站上所有可用图片 URL 的列表?

    我很好奇 DownThemAll 是如何做到这一点的 他们使用 JavaScript 吗 如何使用 Javascript 获取网站中所有 url 的列表 使用集合 Links document links href Images docum
  • 在箱线图中添加每组的观察数

    继这个问题之后 如何在 ggplot2 箱线图中添加每组的观察数量并使用组平均值 https stackoverflow com questions 15660829 我想添加每组的观察数量ggplot箱线图也是如此 但我添加了一种颜色ae
  • Emacs Org 模式:执行简单的 python 代码

    如何在 Emacs 的 Org 模式下执行非常简单的 Python 代码 第一个示例工作正常 但是我无法让它给出最简单计算的结果 works begin src python def foo x if x gt 0 return x 10
  • 原型范围不起作用

    我在应用程序中创建了一个原型作用域 bean 并使用 setter 将其注入到另一个 bean 中 但是当我在类中使用注入的 bean 时 它总是使用相同的实例而不是每次都使用新实例 这是代码的快照
  • 如何更改选项卡栏项目的默认灰色?

    我尝试更改默认的灰色Tab Bar项目 但 Xcode 发现错误 我使用了一些代码 该代码是 import UIKit extension UIImage func makeImageWithColorAndSize color UICol
  • paypal 10544 网关拒绝错误的原因

    您好 请告诉我 paypal DoDirectPayment 10544 Gateway Decline 错误的可能原因 我查了很多资料都找不到原因 首先是强制性的 愚蠢的人类把戏 问题 您确定您使用的卡是有效的信用卡吗 如果您在现场 而不
  • 捕获 stdout 和 stderr 到管道

    我想从子进程中读取 stderr 和 stdout 但它不起作用 main rs use std process Command Stdio use std io BufRead BufReader fn main let mut chil
  • 如何更改 git 历史记录中的文件路径?

    这是我所拥有的 我的代码的 git 存储库 projects proj1 no git repo here yet subproj1 lt current git repo here 这就是我想要的 一个 git 存储库 它现在正在跟踪使用
  • 显示 R 中函数的源代码[重复]

    这个问题在这里已经有答案了 我可以用lm or class knn查看源代码 但我未能显示 princomp 的代码 这个函数 或其他东西 是用 R 编写的还是使用了其他字节码 我也无法使用来自的建议找到源代码如何显示包中 S4 函数的源代
  • 理解 `k : Nat ** 5 * k = n` 签名

    以下函数编译 onlyModByFive n Nat gt k Nat 5 k n gt Nat onlyModByFive n k 100 但有什么作用k以其代表Nat 5 k n syntax 另外 我该如何称呼它 这是我尝试过的 但我
  • 如何读取 web.config 文件中的 appSettings 部分?

    我的 XML 看起来像这样 文件名是web config
  • “cl”未被识别为内部或外部命令

    下面是我在 windows7 中运行 scons 编译器时的错误消息 cl is not recognized as an internal or external command operable program or batch fil
  • 使用 diff 手动合并两个文件

    我想通过执行以下操作来合并两个文件 将两个文件的差异输出到临时文件中并 手动选择我想要复制 保存的行 这里的问题是diff u只给我一个文件行的上下文 而我想以统一的格式输出整个文件 有什么办法可以做到这一点吗 一种可能适合您的选择 sdi
  • 创建反应应用程序,重新加载不起作用

    我刚刚开始使用 React 进行编码创建反应应用程序 https github com facebookincubator create react app 在文档中说 如果您进行编辑 页面将重新加载 我不知道哪个模块负责自动重新加载 we
  • Textarea charCount - 防止用户粘贴

    下面的代码工作正常 只是如果我粘贴一个超过 10 个字符的字符串 它应该只粘贴前 10 个字符 目前还没有这样做 如何防止粘贴超过 10 个字符 http jsfiddle net qfzkw 2 http jsfiddle net qfz
  • 数组大小和复制性能

    我确信这个问题之前已经得到了回答 但我找不到一个好的解释 我正在编写一个图形程序 其中管道的一部分将体素数据复制到 OpenCL 页面锁定 固定 内存 我发现这个复制过程是一个瓶颈 并对一个简单的性能进行了一些测量std copy 数据是浮
  • 在 java 7 上使用 JNI 运行 java 5/6 会出现堆栈保护警告

    使用 1 5 或启用 1 5 比较模式的 1 6 构建的 java 程序会给出以下警告 Java HotSpot TM 服务器 VM 警告 您已加载库 mynativelib so 可能禁用了堆栈保护 虚拟机现在将尝试修复堆栈防护 强烈建议
  • 如何使用 git diff 显示一些不可见的字符差异?

    当我使用git diff 我看到了如下差异 self conv 2 nn Conv2d C in C out 2 1 stride 2 padding 0 bias False self conv 2 nn Conv2d C in C ou
  • 来自多个进程的 Python 日志记录

    我有一个可能长时间运行的程序 当前有 4 个进程 但可以配置为有更多进程 我研究过从多个进程记录 http docs python org howto logging cookbook html logging to a single fi