2017-03-24 5 views
1

私はローカルのファイルサーバーを起動するpythonスクリプトを作成していますが、そのサーバーは生きている間に30秒ごとにファイルに書き込みます。私はライター関数をデーモンスレッドにしたので、サーバとライター関数を同期して実行したいと思います...私の主な質問は、デーモンが書いている途中であれば、このデーモンスレッドはサーバが停止すると終了します。終了する前にその操作を完了しますか?ファイルを1/2にすることは本当に悪いことです。ここにコードがありますが、実際に書き込まれるファイルはJSONの約3k行ですので、心配です。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の影響を受けます。
は、あなたが同期実行をしたい場合、あなたはPythonのドキュメントからmultiprocessing

を使用する必要があります:

デーモンスレッドが突然シャットダウン時に停止しています。それらのリソース(オープンファイル、データベーストランザクションなどの など)は、 が適切にリリースされないことがあります。スレッドを正常に停止させたい場合は、 をデーモン以外のものにして、Eventなどの適切なシグナリングメカニズムを使用します。

これは、デーモンスレッドは、メインスレッドのコンテキストでのみ意味を持ち、メインスレッドが動作を停止しても問題がないことを意味します。ファイルI/O、特にデータの保存は、デーモンスレッドには適していません。

したがって、ライタースレッドを非デーモンにするのが最も明白で論理的な解決策に見えます。
その後、メインスレッドが終了しても、デーモン以外のスレッドがすべて終了するまで、Pythonプロセスは終了しません。これにより、ファイルI/Oを安全に完了して終了することができます。

Pythonのデーモンスレッドの説明が見つかりましたhere

関連する問題