データベースとの接続を確立するコードをPythonで書いています。ループ内にクエリがあります。ループ内でクエリが実行されているときに、ネットワーク ケーブルを抜くと、例外が発生して停止するはずです。しかし、これは起こりません.2分後にネットワークケーブルを再び差し込むと、終了したところから再開します。Linux と psycopg2 を使用しています。例外を表示していません
3 に答える
ダグラスの答えが言ったように、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.
ただし、データベース接続が Python ソケット (ネイティブ ソケットなど) によって構築されていない場合は、機能しない可能性があります。
データベース接続はほぼ確実に TCP ソケットに基づいています。TCP ソケットは、失敗する前に再試行し、(Python では) 例外を発生させるまで、長時間ハングアップします。言うまでもなく、データベース層での再試行/自動再接続の試行。
クライアント ライブラリがサーバーにどのように接続しているかに関係なく機能するタイムアウトを実装する場合は、DB 操作を別のスレッドで試行するか、「監視」スレッド/プロセスが強制終了できる別のプロセスで実行することをお勧めします。必要に応じて; Python 2.6 標準ライブラリの multiprocessing モジュールを参照してください (必要な場合は、2.5 用にバックポートされたバージョンがあります)。スレッドを強制終了することは常にかなり危険で面倒な作業ですが、プロセスが強制終了されると、オペレーティング システムがリソースの割り当て解除とクリーンアップを処理するため、プロセスの方が優れています。