Psycopg2 connect_timeout не работает в приложении WSGI - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над приложением WSGI (Simple HTTP RPC API), созданным с использованием библиотеки spyne, которая работает на сервере apache2.Он использует библиотеку psycopg2 для обработки соединений с базой данных.

Все работает нормально, но проблема возникает, когда соединение с сервером базы данных разорвано или сервер недоступен через сеть.Когда запрос отправляется, он зависает в течение 120 секунд (по умолчанию он выглядит как тайм-аут сокета Unix), затем возникает исключение psycopg2 OperationalError .

DB Соедините часть с connect_timeout:

        try:
            connection_string = 'dbname=%s user=%s host=%s password=%s connect_timeout=5' % (db_name, db_user, server_ip, '')
            cx = psycopg2.connect(connection_string)
        except psycopg2.OperationalError as e:
            log.error('Unable to connect to the database at %s, %s' % (server_ip, e))

Я попытался использовать эту часть кода в другом скрипте, и она работала как ожидалось, через 5 секунд она поднялась OperationalError исключение, но когда я запускаю тот же код в приложении WSGI на apache2, это не работает.

Я попытался установить 'socket-timeout = 5' для WSGIDaemonProcess и после этого он зависает только на 5 секунд, но возвращает HTTP-код 504 клиенту вместо исключения psycopg2.Я не знаю, почему он игнорирует тайм-аут psycop2.connect в приложении WSGI.

Кто-нибудь знает, что может быть не так, пожалуйста?

Спасибо!

1 Ответ

0 голосов
/ 21 мая 2019

Я, конечно, не эксперт по Python, но я уверен, что если вы используете psycopg2.extensions.set_wait_callback, то вы используете механизм libpq PQConnectPolling, который игнорирует параметр connect_timeout.

Не уверен, что есть лучший способ, но вы можете реализовать свой собственный обратный вызов, используя this в качестве шаблона и передать таймаут методу select.select

...