![](/img/trans.png)
[英]Python writing to file from multiple separate Python processes, do I have to lock file?
[英]Writing to file in Python using multiple processes
我一直在探索 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類的完美案例。 讓進程充當消費者,寫入文件,並讓所有其他進程充當生產者,寫入隊列而不是文件。 這可能會勝過您嘗試為自己拼湊的任何鎖定策略,並且幾乎可以肯定它會更加健壯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.