簡體   English   中英

使用多個進程在 Python 中寫入文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM