Как я могу объединить соединения с помощью 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