4

さまざまな方法を使用して解決できることがわかっているかゆみの問題がありますが、Pythonで次のアプローチが可能かどうかを知りたいです。

常に入力を待っているソケットがあり、最終的にプログラム全体を終了させる条件があるとします。私が想像したように、select.selectを使用してBLOCKING方式でそれを行いたい:

readfds, writefds, errfds = select.select([mysocket],[],[])
if readfds:
    conn, addr = mysocket.accept()
    ...

ここで、読み取りまたは書き込みのいずれかの準備完了状態に手動で設定できるファイル記述子 fd があれば、次のことができます。

readfds, writefds, errfds = select.select([mysocket,fd],[],[])
for r in readfds:
    if r == mysocket:
        conn, addr = mysocket.accept()
        ...
    else:
        <terminate>

もちろん、単純に mysocket にメッセージを送信してブロックを解除することはできますが、ファイル記述子を操作して準備完了状態にするプログラム的な方法があるかどうかを知りたいです。

編集:私の質問は:ファイル記述子を手動で「準備完了」に設定できますか?

皆さんありがとう。

4

3 に答える 3

2

最も簡単な方法は、おそらく を使用os.mkfifo()してファイル ペアを作成し、読み取り側をselect()呼び出しに追加してから、ブロックを解除したいときに書き込み側に書き込むことです。

また、select()呼び出しにタイムアウトを追加することを検討することもできます。ブロックされていない時間にパフォーマンスを低下させるほどのことをしているとは想像できません。

于 2010-10-20T21:43:34.780 に答える
0

ソケット ペアを作成し (socket.socketpair()関数を参照)、別の Python スレッドを生成して (threading.Threadクラスを使用)、プログラムの終了時期を通知する特別な条件を監視する必要があると思います。スレッドが条件を検出すると、「Done!」と書き込むことができます。(または何でも)ソケットペアの最後に。読み取りを待機しているソケットのリストにソケット ペアのもう一方の端がある場合、それが点灯し、「Done!」メッセージが表示されるとすぐに読み取り可能であることが示されます。が表示され、ソケットから読み取る準備ができています。

于 2010-10-20T21:27:37.337 に答える