8

非同期のAPIを作成するときに利用できる便利なイディオムはありますか?全体を通していくつかの異なるスタイルを使用しているように見えるので、何かを標準化したいと思います。非同期コードを単純にするのは難しいようです。これは、非同期操作が何でもないためだと思います。

最も基本的なレベルでは、APIのユーザーは次のことができる必要があります。

  1. データが利用可能になったら、データをプッシュしてもらいます
  2. 非同期操作のステータスを確認する
  3. 発生したエラーが通知されます
  4. 完了するのを待ちます(非同期操作を同期操作に変換します)

私のクラスはいくつかの非同期操作をサポートしています。私はその周りのクラスにいくつかのステータス/エラーコールバックを入れてきましたが、クラスは多くの付随的なフィールドでガンガンになり、大きくなりすぎています。誰かが非同期APIを使用したことがあるかどうか、私は興味があります。.NETのBegin/EndAsyncOperation + AsyncResultデザイン、およびJavaのいくつかのクラス(Futureなど)を見てきました。

これはPythonで記述されているため、非常に柔軟性があります。注意点があります。これらの非同期操作の一部は、リモートマシンにマーシャリングされ、そこで実行されます。したがって、すべての操作が必ずしも別のスレッドで実行されるわけではありません。

4

3 に答える 3

4

Python Twistedを見たいと思うかもしれません。これは、非同期操作をサポートする優れたReactorベースの API です。Proactorは、フレームワークのような非同期完了ハンドラーの一般的な用語です。

于 2008-12-18T17:43:31.083 に答える
2

これは、オブザーバーのデザインパターン のように聞こえます。リンク

クライアントオブジェクトはオブザーバーです。APIは、 Observableであるオブジェクトに属しています。

各クライアント(Java用語では)は、オブザーバーインターフェイスを実装します。Pythonでは、オブザーバブルが使用するいくつかのメソッドを提供するのは各クライアントの問題です。

class SomeClientInterface( object ):
    def update( self, source, data ):
        # handle data being pushed from Observable source
    def error( self, from, status ):
        # handle error in Observable source

Observableオブジェクトには、オブザーバーが登録して他のことを行うための方法があります。

class Observable( object ):
    def __init__( self ):
        self.clients= set()
    def register( self, observer ):
        self.clients.add( observer )
    def whenSomethingHappens( self ):
        # doing work
        if itAllWentToHell:
            for c in self.clients:
                c.error( self, "some status object" )
        else:
            for c in self.clients:
                c.update( self, the pushed data )
    def waitFor( self ):
        # observers are waiting...
        return theData
    def status( self ):
        return self.currentState
于 2008-12-18T22:22:09.633 に答える
2

Asynchronous Completion Token および ActiveObject パターンも参照してください。

于 2008-12-18T19:02:46.010 に答える