2017-07-31 10 views
0

私はfirebirdデータベースgemを使用して、ユーザー指定のデータベースに接続しています。ユーザーが正しいデータを提供している限り、正常に動作します。そうでなければ、gemは接続できません。また、gemが例外をスローするまでには非常に時間がかかります。私はタイムアウトを使用しようとしました:このようなタイムアウト:Rubyタイムアウトがタイムアウトしない

database = Fb:Database(connection_data) 
Timeout::timeout(5) do 
    database.connect #that's the part that takes long to connect 
end 

しかし、タイムアウトしません。それは単に待機します(それは長い待ち時間、1分以上です)、そして宝石例外をスローします(タイムアウト例外ではありません)。それは、それが1-2分かかったことを除いて、コードが5秒(タイムアウトに従って)以下で実行されたようです。私は説明を探していましたが(ソースコードもチェックしています)、何も見つかりませんでした。私は本当にそれを修正したくないのです(なぜなら、それは遅れている仕事に移されるためです)。しかし、理由を知りたいのですが、どのようにタイムアウトを無視できますか?

また、以下のコードは正常に動作します。

Timeout::timeout(5) do 
    sleep(10) 
end 

答えて

0

タイムアウトブロックは、新しいスレッドでコードを実行し、timeoutは5秒後に発生したときに、例外が強制的にdatabase.connectを実行中のスレッドに(私は信じてThread.raise)を上げています。 (Timeout module code

この割り込みは、どの回線でも発生する可能性があります。この場合、何らかの救済ブロックに入っている可能性があります(またはカスタムエラーが発生した)場合や、正しく処理できない場所で無効な状態になっている可能性があります。ライブラリが防御的にコード化されることはほとんどありませんどこでも

this Reddit threadTimeout::timeoutを使用している問題の詳細を読むことができます。

関連する問題