Подтвердить что ты не робот

Twisted + SQLAlchemy и лучший способ сделать это

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

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

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

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

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

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

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

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

Любые лучшие идеи?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

http://findingscience.com/twistar/