簡體   English   中英

如何安全地將文件系統用作Python中的一種共享memory?

[英]How to safely use the file system as a sort of shared memory in Python?

TLDR:腳本 A 創建一個目錄並在其中寫入文件。 腳本 B 定期檢查該目錄。 腳本 B 如何知道腳本 A 何時完成寫入以便它可以訪問文件?

我有一個 Python 腳本(稱之為渲染服務器),它接收生成圖像和相關數據的請求。 我需要運行一個單獨的 Python 應用程序(稱之為消費者)來使用這些數據。 消費者不知道新數據何時可用。 理想情況下,它不必知道腳本 A 的存在,只需知道數據以某種方式可用即可。

我快速而骯臟的解決方案是讓兩個 Python 腳本都知道一個outputs目錄。 在該目錄中,渲染服務器創建帶時間戳的目錄並在這些目錄中保存多個文件。

渲染服務器做類似的事情:

os.makedirs('outputs/' + timestamped_subdir)
# Write files into that directory.

消費者檢查該目錄有點像:

dirs = set()
while True:
    new_dirs = set(glob('outputs/*')).difference(dirs)
    if not len(new_dirs):
        continue
    # Do stuff with the contents of the latest new directory.

問題是消費者在渲染服務器完成寫入之前檢查了目錄的內容(這在FileNotFoundError中很明顯)。 我試圖通過讓渲染服務器做來解決這個問題:

os.makedisr('temp')
# Write files into that directory.
shutil.copytree('temp', 'outputs/' + timestamped_subdir)

但是在完成復制其中的文件之前,消費者仍然能夠知道timestamped_subdir的存在(同樣存在FileNotFoundError )。 什么是實現我想要實現的目標的“正確”方法?

注意:在寫這篇文章時,我意識到我應該做shutil.move而不是shutil.copytree並且似乎已經修復了它。 但我仍然不確定該操作的底層機制,無法確定它是否正常工作。

通過文件系統處理通信的一種常見方法是依靠原子重命名或鏈接文件或文件夾。

更改您的“渲染服務器”以寫入名為 eg 的文件夾

outputs/' + timestamped_subdir + '_temp/' 

當“渲染服務器”完成該目錄后,將其更改為執行

os.rename('outputs/' + timestamped_subdir + '_temp',  'outputs/' + timestamped_subdir)

只要一切都駐留在同一個文件系統上,重命名將是原子的。

現在你的其他進程只需要忽略以 _temp 結尾的目錄,當它看到另一個文件夾時,它就會知道那些已經完成並完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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