ソースによると、 BaseServer.shutdown() は、サーバーが実行されているスレッドとは異なるスレッドから呼び出す必要があります。
ただし、Web 要求でサーバーに提供された特定の値でサーバーをシャットダウンしようとしています。
リクエスト ハンドラーは明らかにこのスレッドで実行されるため、これを行った後もデッドロックが発生します。
httpd = BaseHTTPServer.HTTPServer(('', 80), MyHandler)
print("Starting server in thread")
threading.Thread(target=httpd.serve_forever).start()
どうすればやりたいことを達成できますか? ソケットやパイプなどをセットアップする必要があります (それが解決策である場合は、これを行う方法を教えてください)。メイン スレッドがブロックし、子スレッドがメッセージを送信するのを待つことができます。 shutdown() を呼び出すには?
現在、リクエストハンドラーから「httpd.socket.close()」を呼び出すことで、「ある種の動作」を実現できます。これにより[Errno 9] Bad file descriptor
エラーが発生し、Windows でプロセスが終了したように見えます。
しかし、これは明らかに正しい方法ではありません。
アップデート 2013 年 8 月堅牢な非同期 I/O の必要性を満たすために node.js で駆け落ちしましたが、多くのサイド プロジェクト (線形代数の研究、さまざまなコマンド ライン ツールのフロントエンドなど) により、Python に戻ってきます。この質問を振り返ってみると、BaseHTTPServer は、他のオプション (Phil が言及しているさまざまなマイクロフレームワークなど) と比較して、おそらく実用的な価値はほとんどありません。