Как я могу объединить соединения с помощью psycopg и gevent?
В документах psycopg указано: "Соединения Psycopg не являются безопасными для зеленого потока и не могут использоваться одновременно разными зелеными потоками. Попытка выполнить более одной команды во времени с использованием одного курсора на поток приведет к ошибке (или тупиковой ситуации в версии до 2.4.2).
Поэтому программистам рекомендуется избегать совместного использования соединений между сопрограммами или использовать библиотечную блокировку для синхронизации общих подключений, например. для объединения ".
Я не могу найти реализацию пула, который является безопасным для зеленого потока - есть ли там там?
Ответы
Ответ 1
Я предполагаю, что вы знаете gevent-psycopg2 модуль, который делает psycopg
приветствующим зелёным.
Ищете решение для объединения пулов Я пробовал 2 решения:
-
SQLALchemy
- кажется, что он работает правильно с потоками, обработанными обезьяной, и gevent-psycopg2
. Класс QueuePool
использует threading
модуль внутри для блокировки, поэтому требуется патч обезьяны, хотя gevent-psycopg2
делает psycopg2
зеленым.
-
a psycopg2
пример объединения пула в примерах gevent
Я пробовал оба решения, но не при загрузке, поэтому я пока не могу сказать об их надежности.
Ответ 2
Если вы вызываете gevent.monkey.patch_thread()
, вы можете использовать psycopg2.pool.ThreadedConnectionPool
.
Ответ 3
Здесь хороший пул (не только пример, но используемый в производстве): psycopg2_pool.py