Gevent с пулом соединений с базой данных для Stream Server

Я использую потоковые серверы Python Gevent для связи с другой машиной (удаленной), которая отправляет одновременные запросы TCP/IP (в среднем 60 запросов в секунду). Природа этого общения в основном связана с вводом-выводом (короткий текст, а затем аудиопотоки). Я намерен использовать Postgresql для хранения результатов каждой связи (например, имя файла, полученное с удаленного сервера).

Я думаю, что это плохая идея - вызывать новое соединение с базой данных для каждого гринлета, созданного в Streamserver (размер пула 90, поэтому максимум 90 запросов в секунду, это максимум, который я ожидаю, и в среднем 60 запросов в секунду). Возможно ли иметь пул соединений с базой данных, который можно поставить в очередь, и каждый гринлет при запуске функции обработчика получает соединение с базой данных из пула? Есть ли учебник, который работал для производственных систем? Как бы вы предложили? Я использую gevent 0.13.8 и postgres 9.1 с Python 2.7.3 на Ubuntu 10.04 64bit.


person user1794913    schedule 02.11.2012    source источник
comment
См.: stackoverflow.com/questions/12650048/   -  person Code Painters    schedule 04.11.2012


Ответы (3)


Альтернативой объединению внутри приложения является объединение с использованием PgBouncer. У вас все еще есть накладные расходы на TCP-соединение и небольшую настройку, но значительно меньше, чем на создание полного нового сеанса PostgreSQL.

В отличие от пула внутри приложения, PgBouncer можно прозрачно внедрить в существующие системы в качестве посредника между PostgreSQL и пулом. Просто переместите PostgreSQl на порт 5433 и пусть PgBouncer прослушивает порт 5432.

person Craig Ringer    schedule 03.11.2012

Gevent включает в себя пул базы данных postgres в примерах:

https://github.com/gevent/gevent/blob/master/examples/psycopg2_pool.py

person Denis Bilenko    schedule 02.11.2012
comment
Согласно моему чтению и использованию Gevent, в версии 0.13.8 нет этого примера. Для меня это не работает, когда установлена ​​​​0.13.8 (выдает ошибку на gevent.wait()). Это часть последней бета-версии. Я попытался импортировать класс Event, а затем wait() вместо gevent.wait(). Это не дает никаких ошибок, но кажется, что где-то зависает/блокируется. Не дает никакого выхода. Что-нибудь готовое/проверенное предложение? - person user1794913; 04.11.2012
comment
замените gevent.wait() на gevent.sleep(30) или gevent.joinall. Сам пул, кажется, не зависит ни от какой функции в 1.0 (хотя я не использовал его с 0.13). - person Denis Bilenko; 04.11.2012

На самом деле я ответил на аналогичный ответ здесь:
Python Postgres psycopg2 Пул ThreadedConnectionPool исчерпан

В основном я настраиваю пул асинхронных соединений с помощью gevent, запускаю соединение Threadpool через postgres и добавляю «зеленое» состояние соединения в postgres.

Таким образом, в основном это создает заданный пул соединений, который вы указываете (например, 100), а затем ставит в очередь запросы, используя этот пул, поскольку один запрос возвращается, обрабатывается новый запрос. Мне нравится этот подход больше, чем обычный пул postgres, из-за асинхронного характера запросов и простоты реализации внутри веб-фреймворка.

person eatmeimadanish    schedule 23.03.2018