Проектирование Async API в Python

(Примечание: этот вопрос строго о дизайне API, а не о том, как его реализовать; то есть я только забочусь о том, что Клиент моего API видит здесь, а не то, что я должен сделать, чтобы сделать это работать.)

Простые термины: я хочу знать установленный узор - если есть - для явные фьючерсы (aka обещает, АКА отложенные, ака задачи - имена варьируются в зависимости от структуры) в Python. Ниже приведено более подробное описание.

Рассмотрим простой Python API, подобный этому:

def read_line():
   ...
s = read_line()
print(s)

Это синхронная версия - она ​​будет блокировать, если линия еще не доступна. Предположим, теперь я хочу предоставить соответствующую асинхронную (неблокирующую) версию, которая позволяет зарегистрировать обратный вызов, который будет вызвать после завершения операции. Например. Простая версия может выглядеть так:

def read_line_async(callback):
   ...
read_line_async(lambda s: print(s))

Теперь, на других языках и рамках, часто существуют существующие обязательные или, по меньшей мере, устоявшиеся утонченные модели для таких API. Например, в .Net до версии 4, как правило, можно было бы предоставить пару BeingReadline / методов EndReadline , и используйте накладки Интерфейс IASYNCRESULT для регистрации обратных вызовов и пройти полученные значения. В .NET 4+, в одном использовании System.Threading.Tasks , чтобы включить все комбинированные операторы задач ( ethOll etc), а также для подключения к C # 5.0 async особенность.

Для другого примера в JavaScript нет ничего, чтобы покрыть это в стандартной библиотеке, но jQuery популяризировал интерфейс «Отложенного обещания», который сейчас , указанный в отдельности . Так что, если бы я собирался написать async js в js, я бы назвал его readlineasync , а также реализует , затем метод на возвращенном значении.

Что, если таковое имеется, является установленным узором в Python Land? Просмотр стандартной библиотеки, я вижу несколько модулей, предлагающих асинхронные API, но без последовательного узора между ними, и ничего подобного стандартизированному протоколу для «задач» или «обещаний». Возможно, есть какой-то шаблон, который может быть получен из популярных сторонних библиотек?

Я также видел (OFT-упомянутый в этом контексте) отсрочен класс в скрученном виде, но кажется, что это чрезмерно для API общего назначения обещания, а скорее адаптированы к конкретным потребностям этой библиотеки. Это не похоже на то, что я мог легко клонировать интерфейс для (без учета зависимости от них), так что наши обещания будут хорошо взаимодействовать, если клиент использует оба библиотеки вместе в его приложении. Есть ли другие популярные библиотеки или рамки, которые имеют явную конструкцию API для этого, чтобы я мог скопировать (и взаимодействовать с), не принимая прямую зависимость?

12
задан Pavel Minaev 2 September 2011 в 04:54
поделиться