我想以線程安全的方式從文件系統讀取和寫入python-source-files。Django - 使文件I/O線程安全
open("n2.py","w").write(my_new_py_class)
from myproject import n2
#do something with n2
我認爲這不是線程安全的,因爲在請求1加載並執行之前request2可能會修改文件。我想實現這樣的一個線程正在等待,直到另一個線程寫入,加載,執行並關閉文件。
我想以線程安全的方式從文件系統讀取和寫入python-source-files。Django - 使文件I/O線程安全
open("n2.py","w").write(my_new_py_class)
from myproject import n2
#do something with n2
我認爲這不是線程安全的,因爲在請求1加載並執行之前request2可能會修改文件。我想實現這樣的一個線程正在等待,直到另一個線程寫入,加載,執行並關閉文件。
你爲什麼要讓你的應用程序修改自己的文件?這不僅是令人難以置信的邪惡,元編程在數量級上更難理解調試。另外,python會緩存它導入的模塊,所以重新加載並不容易。最後但並非最不重要的一點是,如果您確實必須執行動態生成的代碼,則不必將代碼寫入文件以執行它。
要獲得關於在一個線程安全的方式寫文件的問題,一般的慣例是:
這是有效的,因爲在同一臺設備上完成重命名是POSIX系統上的原子操作。因此,其他線程/進程仍然會打開舊文件,現在已從文件系統中分離出來,一旦這些線程/進程完成,它們就會被刪除,否則它們將打開包含所有內容的新文件。你避免了只有一半的文件。
實際上,我喜歡用python的tempfile模塊創建一個臨時目錄,然後在那裏寫入文件,然後移動它並刪除目錄 - 這樣就可以使用默認的umask創建文件。
最後但並非最不重要的一點,在Windows上重命名並非真正原子化,至少默認設置,因爲它不會讓你覆蓋舊文件 - 你需要做兩個重命名,並且引入了種族的可能性條件。我不知道Windows的一個好的解決方案。
我想修改我自己的文件,因爲我必須解決的任務,我在以下線程中描述:http://stackoverflow.com/questions/3590166/instantiate-python-class-from-class-available-as僅在內存中的字符串 感謝您的解釋。我會盡力將它翻譯成代碼。不知道我能做到這一點;-)和Django的應用程序沒有在Windows上運行。 – 2010-08-28 11:27:16
對於給定的PDF合併任務,你還會推薦你的方法嗎? – 2010-08-28 11:38:58
這感覺真的很髒,我敢肯定,導入東西並不是真正的線程安全。至少,使用runpy模塊(http://docs.python.org/library/runpy.html)。請記住用隨機名稱保存文件,以便兩個線程/進程不會踩在彼此的腳趾上。我相信應該有一些將代碼作爲模塊運行的方式,而無需將其寫入文件,但無法找到任何內容:imp模塊需要真實文件,exec不會給你一個模塊...你確定有嗎?在reportlab中進行合併沒有更好的方法嗎? – 2010-08-28 11:52:03
我強烈反對進口動態生成的代碼這種方式。相反,使用compile()和exec()直接編譯和執行代碼。 – 2010-08-29 06:53:32