xmlrpc server(sockerserver) の serve_forever
のように永遠にブロックする関数を呼び出して処理するときにアプリ内部から停止する
JupyterLab とか PyQt とかで GUI でサーバースタート, ストップしたいときなど.
Windows, Unix で使えるのがほしい.
Threading
Pythonのthreadingとmultiprocessingを完全理解
https://qiita.com/kaitolucifer/items/e4ace07bd8e112388c75
ありがとうございます.
thread + event でいけます!
(Python thread も実装には Win32 thread/pthread を使っているようで, 特に pthread の場合基本的には thread を外部から terminate するのはできない)
最新 Python 対応
少なくとも Python 3.7 or more ですと, handle_request()
などはタイムアウト設定しないと無限ループの設定になっていました. 最終的に timeout 設定し以下のような感じになりました.
self.server.timeout = 1
while not self.quitEvent.isSet():
try:
self.server.handle_request()
except:
print("stop")
メインスレッドが終了したらスレッドも停止したいときはデーモン化(setDaemon(True)
)するとよさそうです!
Multiprocessing
Multiprocessing(Fork)とかであれば, terminate or signal 使って停止の方法もあるようだけど... ちょっとめんどいカナ.
おまけ
また, XMLRPC server のベースになっている socketserver では ThreadingMixin など取ることができますが, これはサーバを multithread 化(リクエストをマルチスレッドで処理)するのが主のようです.
TODO
- asyncio(future) でやるほうがよいかも? asyncio は 3.4 から導入されて 3.7 で正式サポートされたようです! https://qiita.com/waterada/items/1c03a7c863faf9327595