Python Twisted и соединения с базой данных
Наши проекты на работе включают синхронные приложения (недолговечные) и асинхронные приложения Twisted (долгоживущие). Мы перефакторили нашу базу данных и собираемся создать модуль API, чтобы отделить все SQL в этом модуле. Я хотел бы создать этот API, чтобы его могли использовать как синхронные, так и асинхронные приложения. Для синхронных приложений я хотел бы, чтобы вызовы API базы данных просто возвращали данные (блокирование), как при использовании MySQLdb, но для асинхронных приложений я хотел бы, чтобы вызовы тех же функций / методов API были неблокирующими, возможно, возвращающими отсроченный. У кого-нибудь есть какие-либо советы, предложения или помощь, которую они могут предложить мне сделать это? Заранее спасибо, Даг
4 ответа
twisted.enterprise.adbapi, кажется, подходит. Как вы думаете, он не соответствует вашим требованиям, и если да, то не могли бы вы объяснить, почему?
В 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, но это будет связано с большим количеством путей кода, которые делают то же самое.
Все библиотеки баз данных, которые я видел, кажутся упрямо синхронными.
Похоже, что Twisted.enterprise.abapi решает эту проблему, используя потоки для управления пулом соединений и оборачивая базовые библиотеки базы данных. Это, очевидно, не идеально, но я полагаю, что это сработает, но я сам на самом деле не пробовал.
В идеале был бы какой-то способ интегрировать sqlalchemy и twisted. Я нашел этот проект, nadbapi, который утверждает, что делает это, но похоже, что он не обновлялся с 2007 года.
Рассматривали ли вы заимствование страницы из стиля продолжения? Stackless Python напрямую поддерживает продолжения, если вы их используете, и этот подход, похоже, уже получил некоторый интерес.