1

Python 2 標準ライブラリの と同じインターフェイスを持つクラスを作成しようとしていますsocket.socket

プログラムがオブジェクトを呼び出そうとしたときにオブジェクトが持つべき動作を再現しようとすると問題が発生しますselect.select()
のエントリのドキュメントには、次のように記載されていselect.selectます。

適切な fileno() メソッド (ランダムな整数だけでなく、実際にファイル記述子を返す) がある限り、ラッパー クラスを自分で定義することもできます。

私はこのようなことを試してみたいと思います.selectを使用してプログラムのスレッドで制御できるファイルのようなオブジェクトを作成し、オブジェクトの読み取りと書き込みの準備ができたら、プログラムの別のスレッドでそれを設定できます。どうすればいいですか?

4

1 に答える 1

3

fileno() 関数は、select システム コール (または poll/epoll/whatever) に渡すことができるように、カーネル ファイル記述子を返す必要があります。選択のような操作によって行われる多重化は、基本的に OS オブジェクトで動作する必要がある OS 操作です。

実際のファイル記述子に基づいていないオブジェクトに対してこれを実装したい場合は、次のことができます。

  • パイプを作成する
  • fileno() からパイプの読み取り終了を返します
  • オブジェクトを「準備完了」としてマークする場合は、もう一方の端にバイトを書き込みます。これにより、select 呼び出しが起動されます。
  • 実際の「読み取り」実装からそのバイトを読み取ることを忘れないでください。

このパイプ トリックはかなり移植性があるはずです。

于 2012-11-16T16:30:27.327 に答える