【问题标题】:If I open and read the file which is periodically written, can I/O deadlock occur?如果我打开并读取定期写入的文件,是否会发生 I/O 死锁?
【发布时间】:2011-08-16 10:22:26
【问题描述】:

在我的服务器进程中,它看起来像这样:

主要后端进程:

  1. 处理大量文件,并将它们记录在 MySQL 中。

  2. 每完成 500 个文件,它就会将“进度报告”写入一个单独的文件 /var/run/progress.log,就像这样“完成 200/5000 个文件”

  3. 它由 4 个子进程进行多进程处理,每个子进程都确保在单独的文件上运行。

Web服务器进程:

  1. 通过 Ajax 每 10 秒读取一次/var/run/progress.log 的输出并报告到进度条。

在处理非常大的文件列表(例如超过 3 GB 的存档)时,进程会在处理大约 2 小时后锁定。

我找不到发生了什么。这是否意味着/var/run/progress.log 导致了 I/O 死锁?

【问题讨论】:

  • 你自己填写'/var/run/progress.log'文件还是使用一些标准的日志模块?
  • 我自己,但写入总是立即关闭。它们就像每 3-5 秒写入一次,具体取决于文件的大小。
  • 除非你使用文件锁,否则没有 I/O 死锁之类的东西——它是你程序某处的错误。在进程上运行 strace -p 以查看它正在尝试做什么。
  • 让我们说,当一个进程打开一个文件并将数据写入其中,然后另一个文件尝试读取(打开的文件未关闭)不会导致 IO 减速/锁定?
  • 不,它不会死锁。但是,您的阅读应用程序可以读取部分更新。如果您的解析代码未编写为预期无效数据,则您可能会遇到来自意外地方的异常。根据您的代码结构,这很容易导致出现“死锁”

标签: python linux performance io deadlock


【解决方案1】:

在 Linux 上的 python 中,这不应该阻塞,但是尝试使用 os 模块

os.open(file, os.O_NONBLOCK | os.O_RDONLY)

并确保关闭文件fh.close(),因为 Python 有点懒惰地清理文件。

http://docs.python.org/library/os.html

【讨论】:

    【解决方案2】:

    快速建议,确保(例如,非常确定)您确实关闭了文件。

    所以总是为此使用 try-except-final 块

    请记住,最终块的内容将始终被执行,这将防止您头疼:)

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2019-12-20
      • 2023-04-05
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多