2

ソースによると、 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 が言及しているさまざまなマイクロフレームワークなど) と比較して、おそらく実用的な価値はほとんどありません。

4

2 に答える 2

3

1. BaseHTTPServer ドキュメントから

永久に実行されるのではなく、何らかの条件が満たされるまで実行されるサーバーを作成するには:

def run_while_true(server_class=BaseHTTPServer.HTTPServer,
                   handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    """
    This assumes that keep_running() is a function of no arguments which
    is tested initially and after each request.  If its return value
    is true, the server continues.
    """
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    while keep_running():
        httpd.handle_request()

終了する条件を設定するためのいくつかの URL 呼び出しを許可します。

Edit :keep_runningは、選択した任意の関数であり、次のように簡単です。

def keep_running():
    global some_global_var_that_my_request_controller_will_set
    return some_global_var_that_my_request_controller_will_set 

あなたはおそらくもっとスマートなものが欲しいと思っていますwithout_rediculously_long_var_names

2.通常、BaseHTTPServer は希望する値よりも低くなります。ニーズに合ったマイクロフレームワークがたくさんあります

于 2012-07-15T17:41:12.157 に答える
2

threading.Eventは、他のスレッドにシグナルを送るのに役立ちます。例えば、

please_die = threading.Event()

# in handler
please_die.set()

# in main thread
please_die.wait()
httpd.shutdown()

スレッド間でデータを送信する場合は、キューを使用できます。

于 2012-07-15T17:44:41.153 に答える