我有一個在Apache HTTPD後面運行的Flask應用程序。 Apache被配置爲擁有多個子進程。如何在Apache終止Flask進程時調用函數?
燒瓶應用程序創建了文件的名稱等於其進程ID在服務器上的文件。 代碼看起來是這樣的:
import os
@app.before_first_request
def before_first_request():
filename = os.getpid()
with open(filename, 'w') as file:
file.write('Hello')
當子進程被終止/結束/終止我想瓶應用刪除此文件。
這是不是非常重要的是移除文件的情況發生,因爲這些文件不會佔用太多的空間,因此,如果出現離奇失誤,我不需要處理它們。但是對於正常的工作流程,我希望在Apache關閉Flask進程時進行一些清理。
上做到這一點的最好方法你知道嗎?
阿帕奇/ mod_wsgi的肯定總是試圖確保的atexit回調調用,即使在情況下,過程由於諸如請求超時等條件而不得不關閉。在gunicorn中沒有這麼好的保證,你必須更加小心地使用gunicorn下的atexit作爲它不會被調用的各種情況。在任何情況下,您都不應該依賴它,並且應用程序應該對後續運行中存在的文件具有彈性(如果它不應存在)。一個單獨的任務來刪除可能需要的其他答案描述。 –
對於其他WSGI服務器,atexit回調甚至可能根本不會被調用。我相信uWSGI的情況仍然如此,除非你強迫它使用單個解釋器,因爲它沒有采取措施確保在子解釋器中調用回調函數。由於Python不會在子解釋器中調用atexit回調函數,並且Apache/mod_wsgi正在使用特殊技巧來確保它們是必需的,所以必須採取特殊步驟。 –
更多信息@GrahamDumpleton!感謝你,以及os.remove'調用的異常警衛。 –