使用多个进程在Python中写入文件
我一直在探索python中的多处理器编程,以及它与多线程的区别,我的疑问是关于写入文件。下面是我发现的,对于下面的代码,没有任何内容写入文件,我认为这是因为打开的文件处理程序没有在进程之间共享使用多个进程在Python中写入文件,python,multithreading,locking,multiprocessing,critical-section,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()))
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()
我对此表示怀疑。这里的“open”调用是否阻塞并且已经受到保护,或者我是否需要在“write_to_file”调用周围实现锁定?本质上,当文件被另一个进程写入时,是否会对一个进程执行“打开”调用块 虽然可以协调从多个进程到其中并发打开的文件的写入,但通过锁定,可能需要范围锁定,可能需要fsync()和seek()。。。虽然这在大多数操作系统和某些条件下都是可能的。。。它还可能容易出错、不可靠,并且会出现一些奇怪的情况(特别是对于通过网络共享的文件,如NFS或SMB) 我认为这是使用多处理.Queue类的完美案例。让on-process充当使用者,写入文件,让所有其他人充当生产者,写入队列而不是文件。这可能会比您自己尝试拼凑的任何锁定策略表现更好,而且几乎可以肯定会更加健壮