Скрученный + SQLAlchemy и лучший способ сделать это

Таким образом, я пишу еще одному Скрученному основанному демону. Это будет иметь интерфейс xmlrpc, как обычно, таким образом, я смогу легко общаться с ним и иметь другой, обрабатывает данные обмена с ним по мере необходимости.

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

Мы хотели бы сделать то же для этого приложения и кода библиотеки повторного использования, который использует Алхимию SQL. Таким образом, что сделать? Хорошо, конечно, так как та библиотека была записана для использования в приложении Опор, это - весь простой код стиля блокирования, к которому все приучены, и все неблокирование волшебно обрабатывается Опорами через поточную обработку, местных жителей потока, определил объем сессий и так далее.

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

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

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

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

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

Какие-либо лучшие идеи?

31
задан Khorkrak 10 June 2010 в 18:26
поделиться

2 ответа

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

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

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

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

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

См. Пример по этой ссылке:

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

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

6
ответ дан 27 November 2019 в 22:48
поделиться

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

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

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

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

6
ответ дан 27 November 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: