Twisted + SQLAlchemy и лучший способ сделать это - PullRequest
31 голосов
/ 10 июня 2010

Итак, я пишу еще один демон на основе Twisted.Он будет иметь интерфейс xmlrpc, как обычно, поэтому я могу легко общаться с ним, и другие процессы будут обмениваться данными с ним по мере необходимости.

Этот демон должен иметь доступ к базе данных.Мы использовали SQL Alchemy вместо жесткого кодирования строк SQL для наших последних проектов - в основном для веб-приложений в Pylons.

Мы хотели бы сделать то же самое для этого приложения и повторно использовать библиотекукод, который использует SQL Alchemy.Так что делать?Ну, разумеется, поскольку эта библиотека была написана для использования в приложении Pylons, это весь простой код стиля блокировки, к которому все привыкли, и вся неблокировка волшебным образом обрабатывается Pylons посредством потоков, локальных потоков, сессий с областями видимости и т. Д.на.

Так что теперь для Twisted я думаю, я немного застрял.Я мог бы:

  1. Просто напишите нужный мне sql напрямую, если он минимальный, и использовать пул dbapi в витой для выполнения runInteractions и т. Д., Когда мне нужно нажать на db.
  2. Использовать объектыи, по сути, блокирует методы в нашей библиотеке и блокирует то и дело в моем Twisted демоне.Бах.
  3. Используйте sAsync, который последний раз обновлялся в 2008 году, и снова используйте модели, которые мы уже определили, но не совсем, и это не означает, что код библиотеки должен работать и в Pylons.Это работает даже с последней версией Алхимии SQL?Кто знает.Однако этот проект выглядел великолепно - почему он был заброшен?
  4. Создает отдельный подпроцесс и заставляет его работать с кодом библиотеки и всеми его блокировками, результаты возвращаются обратно моему демону, когда все готово, как объекты маршалируются через YAML через xmlrpc.
  5. Используйте deferToThread изатем удалите возвращенные объекты, убедившись в том, что я загружаю их так, чтобы у меня были все мои вещи, которые мне могут понадобиться.Мне это кажется ужасным.

Я также застрял с использованием Python 2.5.4 atm, так что пока нет 2.6, и я не думаю, что могу просто выполнить импорт из будущего, чтобы получить доступ ктам есть классный новый многопроцессорный модуль.Это нормально, хотя я полагаю, что у нас довольно неплохо работает межпроцессное взаимодействие.

Так что я склоняюсь в основном к варианту 4, так как это позволит избежать смертельного греха логического дублирования с вариантом 1, оставаясь при этомчерт возьми от темы.

Хотя моей первой попыткой будет вариант 2, просто начать работу, а затем разделить вызовы библиотечного кода, возможно, в отдельный процесс, если кажется, что есть хороший шанс, что что-то может занять немногодолго блокировать.Печальный.Может быть, здесь было бы интересно сочетание Stackless Python и Twisted.

Есть идеи получше?

Ответы [ 4 ]

10 голосов
/ 08 июля 2014

За прошедшую пару лет Алекс Гейнор создал https://github.com/alex/alchimia, который может стать лучшим центральным хранилищем для интеграции с SQLAlchemy и Twisted.

6 голосов
/ 23 июня 2010

Существует штормовая ветвь, которую вы можете использовать с витой напрямую (внутренне это откладывает нить на вещи) на панели запуска https://code.launchpad.net/~therve/storm/twisted-integration. Я использовал это красиво.

К сожалению, sqlalchemy значительно большесложный в реализации аудит для асинхронного использования.Если вы действительно хотите его использовать, я бы порекомендовал использовать внепроцессный подход со слоем rpc хранилища.

в качестве альтернативы, если вы чувствуете себя предприимчивым и используете postgresql, последняя версия pyscopg2 поддерживает истинное асинхронное использование (https://launchpad.net/txpostgres), и источник шторма довольно просто взломать; -)

кстати, у шторма, который вы пробовали в прошлом году, возможно, не было включено C-расширение по умолчанию (оно теперь в последних выпусках), котороеможет быть причиной ваших проблем со скоростью.

6 голосов
/ 15 июня 2010

Во-первых, я могу, к сожалению, только второе, ваше мнение, что витая и SQLAlchemy не очень хорошо играют.Я работал с некоторыми из них и немного боялся бы сложности, возникающей при их объединении.

Все известные мне на сегодняшний день слои интеграции баз данных используют слой интеграции многопоточности Twisteds, и если вы хотитево избежание этого любой ценой вы застряли в пункте 4 в своем списке.

С другой стороны, я видел примеры кода для подключения к базе данных с использованием deferToThread () и друзей, которые работали очень хорошо.

В любом случае, некоторые указатели, если вы готовы рассмотреть другие фреймворки, кроме SQLAlchemy:

Ребята из DivMod проделали некоторую предварительную работу по интеграции витой базы данных на основе Storm ORM (Google Storm)orm ").

См. эту ссылку для примера:

http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html

Кроме того, зайдите на сайт DivMod и посмотрите на источники их Axiom dbслой (вероятно, не имеет никакого отношения к вам напрямую, так как это только Sqlite, но его принципы могут быть полезны).

3 голосов
/ 28 июня 2012

Возможно, твистар - это то, что вы ищете.Это встроенная реализация активной записи (иначе ORM) для витой, работающая поверх twisted.enterprise.adbapi.

http://findingscience.com/twistar/

...