Итак, я пишу еще один демон 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.
Любые лучшие идеи?