gtk.main()イベントループを実行します。内部には次のようなコードがあるため、終了せず、何もせずにフリーズすることもありません。
while True:
timeout = timers.earliest() - datetime.now()
try:
message = wait_for_next_gui_message(timeout)
except TimeoutError:
handle_any_expired_timers()
else:
handle_message(message)
そのwait_for_next_gui_message関数は、X11、WindowServer、Windows の名前のないものなどを待って、「ユーザーがボタンをクリックしました」や「ユーザーが ctrl-Q を押した」などのメッセージを配信する、さまざまなプラットフォーム固有の関数のラッパーです。
、などで呼び出しhttp.serve_forever()または類似した場合、はすべてのソケットのリストである のようなものをラップする関数であることを除いて、まったく同じことを行います。twistedHTTPServerwait_for_next_network_message(sources, timeout)select.selectsources
gstreamer パイプでリッスンしている場合、 はsourcesそのパイプであり、wait_for_next関数はselect.select.
もちろん、 のようなネットワーク フレームワークを使用することもできますtwisted。
ただし、このようにアプリを設計する必要はありません。複数のソースを待つ必要がない場合は、次のようにブロックできます。
while True:
data = pipe.read()
handle_data(data)
パイプがノンブロッキングに設定されていないことを確認してください。よくわからない場合はsetblocking、ソケット、fcntlUnix パイプ、または Windows パイプで頭のてっぺんから覚えていない何かを使用して確認できます。
実際、複数のソースを待機する必要がある場合でも、各ソースのブロッキング ループを個別のスレッド (またはプロセス) に配置することで、これを行うことができます。これは数千のソケットでは機能しませんが (その場合はスレッドの代わりに greenlet を使用できます)、3 つまたは 30 の場合は問題ありません。