RubyのThreadつかえなさげ。

| コメント(0) | トラックバック(0)



1時間くらいしかやってないのでひょっとしたら全然ミスってるかもしれないのですが、RubyのThreadはインターフェースはJavaっぽくて分かりやすい感じなのだけど、実際はつかえねーだす。今日やりたかったのはデータベースへのアクセスを並列化する事なんだけど・・・



result = 0
threads = []
hosts = [ ... ]
hosts.each { |h|
threads.push (
Thread.start {
s = Mysql::connect(h);
res = s.query("SELECT COUNT(*) FROM ...")
result += res.fetch_row[0].to_i
}
)
}
threads.each { |t| t.join }

ってコードで、当たり前だけどMutexをこれにつけないといけない。スレッドで共有しているのはresultなので、これを守ってやればいいのかな、と



m = Mutex.new
result = 0
threads = []
hosts = [ ... ]
hosts.each { |h|
threads.push (
Thread.start {
s = Mysql::connect(h);
res = s.query("SELECT COUNT(*) FROM ...")
m.synchronize {
result += res.fetch_row[0].to_i
}
}
)
}
threads.each { |t| t.join }

ところがこれがうまくいかない。resultの値がめちゃくちゃですよ。色々やってみたのだけど、結局うまく行くのは、Threadの中身全体をm.synchronizeしたときだけ・・・ってこれじゃあ結局順番に行うだけだから意味ないじゃん!


FAQをよく見てみると



http://www.ruby-lang.org/ja/man/?cmd=view;name=FAQ%3A%3ARuby%A4%CE%BD%E8%CD%FD%B7%CF%A4%CB%A4%C4%A4%A4%A4%C6#a11.2e5.20.a5.cd.a5.a4.a5.c6.a5.a3.a5.d6.a5.b9.a5.ec.a5.c3.a5.c9.a4.f2.bb.c8.a4.c3.a4.bf.20Ruby.20.a4.cf.a4.ca.a4.a4.a1.a9



がーん。というわけで結局Cで書くしかなさそうだ。


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ