Python Twisted и соединения с базой данных - PullRequest
5 голосов
/ 10 ноября 2009

Наши проекты на работе включают синхронные приложения (недолговечные) и асинхронные витые приложения (долгоживущие). Мы перефакторили нашу базу данных и собираемся создать модуль API, чтобы отделить все SQL в этом модуле. Я хотел бы создать этот API, чтобы его могли использовать как синхронные, так и асинхронные приложения. Для синхронных приложений я хотел бы, чтобы вызовы API базы данных просто возвращали данные (блокирование), как при использовании MySQLdb, но для асинхронных приложений я хотел бы, чтобы вызовы тех же функций / методов API были неблокирующими, возможно, возвращающими отсроченный. У кого-нибудь есть какие-либо советы, предложения или помощь, которые они могут предложить мне сделать это? Заранее спасибо, Дуг

Ответы [ 4 ]

3 голосов
/ 10 ноября 2009

twisted.enterprise.adbapi кажется правильным решением - вы считаете, что оно не соответствует вашим требованиям, и если да, то можете ли вы объяснить, почему?

1 голос
/ 11 ноября 2009

В Twisted вы, в основном, хотите обертку вокруг функции, которая возвращает Deferred (например, слой Twisted DB), ждет его результатов и возвращает их. Тем не менее, вы не можете ждать ожидания, так как он использует ваши циклы реактора, и проверка выполнения задачи с использованием Twisted неблокирующего ожидания, вероятно, неэффективна.

Решат ли вашу проблему inlineCallbacks или deferredGenerator? Они требуют современного Twisted. См. Документацию по витой матрице .

def thingummy():
   thing = yield makeSomeRequestResultingInDeferred()
   print thing #the result! hoorj!
thingummy = inlineCallbacks(thingummy)

Другой вариант заключается в том, чтобы иметь два метода, которые выполняют один и тот же шаблон SQL, один из которых использует runInteraction , который блокирует, и другой, который использует runQuery, который возвращает Deferred, но для этого потребуется больше путей кода которые делают то же самое.

0 голосов
/ 12 ноября 2009

Все библиотеки баз данных, которые я видел, кажется, упорно синхронными.

Похоже, что Twisted.enterprise.abapi решает эту проблему, используя потоки для управления пулом соединений и упаковывая базовые библиотеки баз данных. Это, очевидно, не идеально, но я полагаю, что это сработает, но я сам на самом деле не пробовал.

В идеале был бы какой-то способ интегрировать sqlalchemy и twisted. Я нашел этот проект nadbapi , который утверждает, что делает это, но похоже, что он не обновлялся с 2007 года.

0 голосов
/ 10 ноября 2009

Рассматривали ли вы заимствование страницы из стиля продолжения ? Stackless Python напрямую поддерживает продолжения , если вы его используете, и подход, по-видимому, уже набрал некоторый интерес .

...