(注:この質問は、APIの設計に関するものであり、実装方法に関するものではありません。つまり、APIのクライアントがここで見るものだけを気にし、それを機能させるために何をしなければならないかは気にしません。)
簡単に言えば、Pythonで明示的な先物(別名promise、別名deferred、別名tasks-名前はフレームワークによって異なります)の確立されたパターン(ある場合)を知りたいです。以下は、より詳細な説明です。
次のような単純なPythonAPIについて考えてみます。
def read_line():
...
s = read_line()
print(s)
これは同期バージョンです-回線がまだ利用できない場合はブロックされます。ここで、操作が完了したときに呼び出されるコールバックを登録できる、対応する非同期(非ブロッキング)バージョンを提供するとします。たとえば、単純なバージョンは次のようになります。
def read_line_async(callback):
...
read_line_async(lambda s: print(s))
現在、他の言語やフレームワークでは、そのようなAPIに対して、既存の必須または少なくとも十分に確立されたパターンが存在することがよくあります。たとえば、バージョン4より前の.NETでは、通常、BeginReadLine
/EndReadLine
メソッドのペアを提供し、ストックIAsyncResult
インターフェイスを使用してコールバックを登録し、結果の値を渡します。.NET 4以降ではSystem.Threading.Tasks
、を使用して、すべてのタスク結合演算子(WhenAll
など)を有効にし、C#5.0async
機能に接続します。
別の例として、JavaScriptでは、これを標準ライブラリでカバーするものは何もありませんが、jQueryは、現在個別に指定されている「deferredpromise」インターフェースを普及させました。したがってreadLine
、JSで非同期を作成する場合は、名前を付けて、戻り値にメソッドreadLineAsync
を実装します。then
Pythonの土地で確立されたパターンがあるとすれば、それは何ですか?標準ライブラリを見ると、非同期APIを提供するいくつかのモジュールがありますが、それらの間に一貫したパターンはなく、「タスク」または「約束」の標準化されたプロトコルのようなものはありません。おそらく、人気のあるサードパーティのライブラリから派生できるパターンがいくつかありますか?
Twistedの(このコンテキストでよく言及される)Deferedクラスも見ましたが、汎用のpromise API用に過剰に設計されており、このライブラリの特定のニーズに適合しているようです。クライアントがアプリケーションで両方のライブラリを一緒に使用する場合、私たちの約束がうまく相互運用できるように、(それらに依存することなく)インターフェイスを簡単に複製できるもののようには見えません。直接依存することなくコピー(および相互運用)できる、このために明示的に設計されたAPIを備えた他の人気のあるライブラリまたはフレームワークはありますか?