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

还可以查看异步完成令牌和 ActiveObject 模式。

于 2008-12-18T19:02:46.010 回答
2

这听起来像观察者设计模式。 链接

您的客户端对象是Observer。您的 API 属于Observable的对象。

每个客户端(用 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
于 2008-12-18T22:22:09.633 回答