私は、ctypesモジュールを使用してPythonでWindows DLL APIを使用してIO完了ポートベースのサーバー(source code here)を作成しています。しかしこれはAPIのかなり直接的な使い方であり、この質問はPythonではなくIOCPの知識を持っている人を対象としています。IO完了ポートキーの混乱
私はCreateIoCompletionPortのドキュメントを理解しているので、作成したIOCPに関連付けるファイルハンドル(私の場合はソケット)を使ってこの関数を呼び出すと、 "ユーザー定義の"完了キーを指定します。 GetQueuedCompletionStatusを呼び出すときには、オーバーラップしたオブジェクトへのポインタとともに完了キー値を取得します。完了キーは、重複したオブジェクトと要求が完了したことを特定する必要があります。
しかし、CreateIoCompletionPort呼び出しで、オーバーラップしたオブジェクトを使用して完了キーとして100を渡したとします。同じオーバーラップしたオブジェクトがIOを完了し、GetQueuedCompletionStatusを介して戻ってくると、それに付随する完了キーは元の値の100にほとんど似ていません。
完了キーの仕組みを誤解していますか。上記のリンク先のソースコードで間違っている必要がありますか?
"CreateIoCompletionPort呼び出しで完了キーとして100を渡したとしましょう。同じオーバーラップオブジェクトがIOを完了し、GetQueuedCompletionStatusを通じて戻ってくると、それに伴う完了キーははるかに大きく、 100の元の値には似ていません。私の質問から、なぜ私はソースコードでそれを比較していません。 重複したオブジェクトがガベージコレクションされている可能性はありますが、これは質問とは関係ありません。 –