惯用异步设计

时间:2008-12-18 17:27:35

标签: python asynchronous

在编写异步API时,我可以使用哪些有用的习惯用法?我希望标准化一些东西,因为我似乎总是使用一些不同的样式。似乎很难使异步代码变得简单;我想这是因为异步操作不过是。

在最基本的层面上,API的用户必须能够:

  1. 在数据可用时将数据推送给他们
  2. 检查异步操作的状态
  3. 收到有关错误的通知
  4. 等待完成(将异步操作转换为同步操作)

我的类支持多个异步操作。我一直在课堂上放置一些状态/错误回调,但是这个类在很多偶然的字段中变得很糟糕,而且变得太大了。我很好奇是否有人使用过他们发现组织良好的异步API。我查看了.NET的Begin / EndAsyncOperation + AsyncResult设计,以及Java中的一些类(例如Future)。

这是用Python编写的,所以它仍然非常灵活。有一点需要注意:其中一些异步操作正在被封送到远程机器并在那里执行。因此,并非每个操作都必须在单独的线程中执行。

3 个答案:

答案 0 :(得分:4)

您可能需要查看Python Twisted。这是一个很好的基于Reactor的API,支持asynchronous操作。 Proactor是异步完成处理程序(如框架)的常用术语。

答案 1 :(得分:2)

另请参阅Asynchronous Completion Token和ActiveObject模式。

答案 2 :(得分:2)

这听起来像 Observer 设计模式。 link

您的客户端对象是观察者。您的API属于可观察的对象。

每个客户端(用Java术语)实现 Observer 接口。在Python中,每个客户端都提供了一些您的observable将使用的方法。

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