Идиоматический асинхронный дизайн - PullRequest
8 голосов
/ 18 декабря 2008

Существуют ли какие-либо полезные идиомы, которые я могу использовать при написании асинхронного API? Я хотел бы стандартизировать что-то, поскольку я, кажется, использую несколько различных стилей повсюду. Кажется, трудно сделать простой асинхронный код; Я полагаю, это потому, что асинхронные операции - это не что иное, как *. 1001 *

На самом базовом уровне пользователь API должен иметь возможность:

  1. Получать данные, когда они становятся доступными
  2. Проверка состояния асинхронной операции
  3. Получать уведомления об ошибках, которые происходят
  4. Ожидание завершения (преобразование асинхронной операции в синхронную).

Мои классы поддерживают несколько асинхронных операций. Я поместил некоторые обратные вызовы состояния / ошибки в классе вокруг него, но класс становится переполненным множеством случайных полей, а также становится слишком большим. Мне любопытно, использовал ли кто-нибудь асинхронный API, который они нашли хорошо организованным. Я рассмотрел проект Begin / EndAsyncOperation + AsyncResult .NET, а также некоторые классы в Java (например, в будущем).

Это написано на Python, поэтому оно остается очень гибким. Существует предостережение: некоторые из этих асинхронных операций направляются на удаленную машину и выполняются там. Таким образом, не каждая операция обязательно выполняется в отдельном потоке.

Ответы [ 3 ]

4 голосов
/ 18 декабря 2008

Возможно, вы захотите взглянуть на Python Twisted . Это хороший Reactor API, который поддерживает асинхронные операции. Proactor - это общий термин для асинхронного обработчика завершения, такого как фреймворки.

2 голосов
/ 19 декабря 2008

Похоже на шаблон проектирования Observer . ссылка .

Ваш клиентский объект - Наблюдатель . Ваш API принадлежит объекту, который Наблюдаемый .

Каждый клиент (на языке Java) реализует интерфейс Observer . В 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
2 голосов
/ 18 декабря 2008

Также обратите внимание на шаблоны асинхронного маркера завершения и ActiveObject.

...