2009-05-15 3 views
0

Я пишу код на питоне, в котором я установил соединение с базой данных. У меня есть запросы в цикле. Хотя запросы выполняются в цикле, если я отключу сетевой кабель, он должен остановиться с исключением. Но этого не происходит, Когда я снова подключаю сетевое устройство через 2 минуты, он снова начинается с того места, где он заканчивается. Я использую linux и psycopg2. Не отображается исключениеdb connection in python

+0

Сообщите нам ваш код? –

+1

Кричать «нужна помощь срочно», вероятно, не лучший способ получить сочувствие. – bortzmeyer

ответ

2

Соединение с базой данных почти наверняка будет основано на сокете TCP. Сокеты TCP будут долгое время зависеть от повторной попытки до сбоя и (в python), создавая исключение. Не говоря уже и попытки повторного подключения/автоматического повторного соединения в слое базы данных.

2

Как сказал ответ Дугласа, он не будет вызывать исключения из-за TCP.

Вы можете попытаться использовать socket.setdefaulttimeout(), чтобы установить меньшее значение таймаута.

setdefaulttimeout (...)

setdefaulttimeout(timeout) 

    Set the default timeout in floating seconds for new socket objects. 
    A value of None indicates that new socket objects have no timeout. 
    When the socket module is first imported, the default is None. 

Однако, он не может работать, если соединение с базой данных не строить на питона сокет, например, родное гнездо.

1

Если вы хотите реализовать тайм-ауты, которые работают независимо от того, как клиентская библиотека подключается к серверу, лучше всего попытаться выполнить операции БД в отдельном потоке или, лучше, отдельный процесс, который представляет собой «мониторный» поток/процесс может убить, если необходимо; см. модуль многопроцессорности в стандартной библиотеке Python 2.6 (для этого требуется версия с поддержкой backported для версии 2.5). Процесс лучше, потому что когда он будет убит, операционная система позаботится об освобождении и очистке ресурсов, в то время как убийство потока всегда является довольно опасным и беспорядочным бизнесом.

+0

можно объяснить более подробно – ha22109

+0

Начните с чтения http://docs.python.org/library/multiprocessing.html, в котором объясняется, как использовать модуль многопроцессорности в стандартной библиотеке (2.6 или выше Python; если вы на 2.5 , установите backport с code.google.com/p/python-multiprocessing/). Не так много места в комментарии, чтобы дать гораздо больше деталей, но идея такова: сделать две очереди quin и quout, сделать процесс с очередями, и когда вам нужно, чтобы SQL-запрос нажимал его на quin, процесс ожидает этой очереди, вытаскивает запрос, делает это, толкает результаты на quout; запрашивающий процесс убивает другого, если он занимает слишком много времени. –