python - 使用多个进程在 Python 中写入文件

标签 python multithreading locking multiprocessing critical-section

我一直在探索 python 中的多处理器编程及其与多线程的区别以及我对写入文件的疑虑。所以这是我发现的,对于以下代码,没有任何内容写入文件,我认为这是因为打开的文件处理程序未跨进程共享。

import multiprocessing
import sys
import datetime
import time


def worker(fd, index):
  fd.write("worker %d %s\n" % (index, datetime.datetime.now()))
  time.sleep(5 - index)
  fd.write("worker %d again %s\n" % (index, datetime.datetime.now()))

if __name__ == '__main__':
  fd = open(sys.argv[1], "w")
  threads = list()
  for i in xrange(5):
    th = multiprocessing.Process(target=worker, args=(fd, i,))
    threads.append(th)
    th.start()

  for each in threads:
    each.join()

  fd.close()

而由于线程之间共享内存,下面的代码工作正常。

import threading
import sys
import datetime


def worker(fd, index):
  fd.write("worker %d %s\n" % (index, datetime.datetime.now()))
  time.sleep(5 - index)
  fd.write("worker %d again %s\n" % (index, datetime.datetime.now()))

if __name__ == '__main__':
  fd = open(sys.argv[1], "w")
  threads = list()
  for i in xrange(5):
    th = threading.Thread(target=worker, args=(fd, i,))
    threads.append(th)
    th.start()

  for each in threads:
    each.join()

  fd.close()

我想使用多个进程而不是线程来写入同一个文件,所以我实现了以下内容。我假设我可能必须使用锁来限制不同进程对文件的访问,但是如果没有它,以下内容似乎也能正常工作。

import multiprocessing
import sys
import datetime
import time


def write_to_file(text, file_name):
  fd = open(file_name, "a")
  fd.write(text)
  fd.close()


def worker(file_name, index):
  while True:
    write_to_file("worker %d %s\n" % (index, datetime.datetime.now()), file_name)
    time.sleep(5 - index)
    write_to_file("worker %d %s again\n" % (index, datetime.datetime.now()), file_name)


if __name__ == '__main__':
  file_name = sys.argv[1]
  fd = open(file_name, 'w')
  fd.write("test input\n")
  fd.close()
  jobs = []
  for i in xrange(5):
    process = multiprocessing.Process(target=worker, args=(file_name, i,))
    process.start()
    jobs.append(process)

  for j in jobs:
    j.join()

我的疑惑就在于此。此处的“打开”调用是否阻塞并已受到保护,或者我是否需要围绕对“write_to_file”的调用实现锁定?本质上,当文件正在被另一个进程写入时,一个进程的“打开”调用是否会阻塞?

最佳答案

虽然可以协调从多个进程到一个文件的写入,该文件在它们之间同时打开,但通过锁定,可能需要范围锁定,可能需要 fsync()seek () ...虽然这在大多数操作系统和某些条件下都是可能的...但它也可能容易出错、不可靠,并且会遇到一些奇怪的极端情况(尤其是对于通过网络共享的文件,例如作为 NFS 或 SMB)。

我认为这是使用 multiprocessing.Queue 类的完美案例。让进程充当消费者,写入文件,并让所有其他进程充当生产者,写入队列而不是写入文件。这可能会胜过您尝试自己拼凑的任何锁定策略,而且几乎可以肯定它会更加健壮。

关于python - 使用多个进程在 Python 中写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663799/

相关文章:

C# 定期从不同线程返回值

python - 没有找到 PyTorch 和 TensorFlow >= 2.0。模型将不可用,只能使用标记器、配置和文件/数据实用程序

c++ - 中断 boost 线程

android - 使用 NsdManager.DiscoveryListener 时固定时间段的服务发现

c - STDIO锁定: how to check if every flockfile() has been matched by funlockfile()?

C# 文件正在被另一个进程使用

python - 如何在文本文件中搜索单词并使用 Python 打印部分行?

python - 我需要比较 2 个不同数据帧的 2 个字段(如果匹配),我们需要填充详细信息,否则在 python 中填充空值

python - 查找一个数字是否存在于列表指定的数字范围之间

MySQL 隔离级别,测量它们对死锁的影响