0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python で interruptible な xmlrpc server(socketserver) を作るメモ(threading)

Last updated at Posted at 2022-07-25

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?