2004-01-21 (Wed) [長年日記]
_ Net::IMAPでclosed streamエラー
mobileimapで以下のようなエラーが出るというレポートをいただいた。
closed stream /usr/local/lib/ruby/1.8/net/imap.rb:1013:in `write' /usr/local/lib/ruby/1.8/net/imap.rb:1013:in `print' /usr/local/lib/ruby/1.8/net/imap.rb:1013:in `put_line' /usr/local/lib/ruby/1.8/net/imap.rb:986:in `send_command' /usr/local/lib/ruby/1.8/net/imap.rb:980:in `synchronize' /usr/local/lib/ruby/1.8/net/imap.rb:998:in `send_command' /usr/local/lib/ruby/1.8/net/imap.rb:311:in `logout' ...
Net::IMAPのせいではないか、ということだけど、そうに違いない。 ごめんなさい。
でも、上記のバックトレースだけでは状況がよくわからない。
Net::IMAPはスレッドを使ってるのだが、Rubyだとメイン以外のスレッド
が例外で落ちた時にデフォルトでは何もおこならい(Javaとかはどうなんだっけ)
ので、バックトレースの情報があんまり有用でないことがある(本当の問
題はバックトレースが出てくるより前の、別スレッドの挙動にあるため)。
こういう時は、Thread.abort_on_exception = true
とすると原因
がわかることが多い。
*1
*2
あと、Rubyのスレッドではまりやすいのは、Cで実装したメソッドの中で ブロックしてしまうと(関係ないスレッドもふくめて)全部の処理が止まっ てしまうことだ。 たとえば、データベースのトランザクションなんかでデッドロックに陥 ると、どうしようもなくなる。 *3
_ Changes
rubyの変更点を日本語で読みたい時は <URL:http://rrr.jin.gr.jp/rwiki?cmd=view;name=ruby-cvs> を見ればいいらしい。 *1
*1 というか、書かなきゃ。