我一直在探索 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/