Как я могу объединить соединения с помощью psycopg и gevent?

Документы psycopg гласят: "Соединения Psycopg не безопасны для" зеленых потоков "и не могут использоваться разными зелеными потоками одновременно. Попытка выполнить более одной команды одновременно с использованием одного курсора на поток приведет к ошибке (или тупиковой ситуации в версиях"). до 2.4.2). Поэтому программистам рекомендуется либо избегать совместного использования соединений между сопрограммами, либо использовать дружественную к библиотеке блокировку для синхронизации общих соединений, например, для объединения в пул ".

Я не могу найти реализацию пула, которая является безопасной для зеленого потока - есть ли там что-нибудь?

3 ответа

Решение

Я предполагаю, что вы знаете модуль gevent-psycopg2, который делает psycopg greenlet удобно.

В поисках решения для пула подключений я пробовал 2 решения:

  • SQLALchemy - кажется, что он работает правильно с залатанными обезьянами потоками и gevent-psycopg2, QueuePool класс использует threading Внутренний модуль для блокировки, поэтому необходимо исправление обезьян gevent-psycopg2 марки psycopg2 зеленый.

  • есть psycopg2 пример пула соединений в gevent Примеры

Я испробовал оба решения, но не в условиях производственной нагрузки, поэтому пока не могу сказать об их надежности.

Если вы позвоните gevent.monkey.patch_thread() Вы должны быть в состоянии использовать psycopg2.pool.ThreadedConnectionPool,

Вот хороший пул (не просто пример, но используемый в производстве): psycopg2_pool.py

Другие вопросы по тегам