2017-03-24 25 views
1

我正在編寫一個python腳本,它將啓動一個本地文件服務器,並且當該服務器處於活動狀態時,它將每隔30秒寫入一個文件。我想讓服務器和寫入器函數同步運行,所以我讓寫入器函數成爲守護進程線程......我的主要問題是,因爲一旦服務器停止,守護進程線程將退出,如果守護進程正處於寫入到一個文件將在退出之前完成該操作?用1/2的文件留下真的很糟糕。這裏是代碼,但它要寫的實際文件大約是3千行JSON,因此值得關注。Python3:等待守護進程完成迭代

import http.server 
import socketserver 
from time import sleep 
from threading import Thread 


class Server: 
    def __init__(self): 
     self.PORT = 8000 
     self.Handler = http.server.SimpleHTTPRequestHandler 
     self.httpd = socketserver.TCPServer(("", self.PORT), self.Handler) 
     print("Serving at port", self.PORT) 

    def run(self): 
     try: 
      self.httpd.serve_forever() 
     except KeyboardInterrupt: 
      print("Server stopped") 


def test(): 
    while True: 
     with open('test', mode='w') as file: 
      file.write('testing...') 
     print('file updated') 
     sleep(5) 


if __name__ == "__main__": 
    t = Thread(target=test, daemon=True) 
    t.start() 
    server = Server() 
    server.run() 

回答

1

它看起來像你可能做出了一個不正確的決定,使作家線程守護進程。
製作守護線程並不意味着它將同步運行。它仍然會受到GIL的影響。
如果你想同步執行,你將不得不使用multiprocessing

從Python文檔:

守護線程突然停在關機。他們的資源(如 作爲打開文件,數據庫事務等)可能不會正確釋放 。如果您希望線程正常停止,請將它們設爲非守護進程,並使用合適的信號機制,例如Event

因此,這意味着守護進程線程只適用於在主線程上下文中有意義的任務,並且在主線程停止工作時無關緊要。文件I/O,特別是數據保存,不適用於守護進程線程。

所以看起來最明顯的和合乎邏輯的解決方案是使寫入器線程不是守護進程。
然後,即使主線程退出,Python進程也不會結束,直到所有非守護線程完成。這允許文件I/O完成並安全地退出。

Python中的守護線程的解釋可以發現here