永井@知能.九工大です.

From: Nobuyoshi Nakada <nobu / ruby-lang.org>
Subject: [ruby-dev:39355] Re: [ruby19] Thread 切替えが異常に遅い?
Date: Sun, 20 Sep 2009 19:21:53 +0900
Message-ID: <4ab6023e.9613f30a.34f3.ffff9f7e / mx.google.com>
> At Sun, 20 Sep 2009 12:27:48 +0900,
> Hidetoshi NAGAI wrote in [ruby-dev:39352]:
> > 忙しくて暫く放置していて,今日,久しぶりに動かしてみたのですが,
> > 今の 1.9 って,Thread 切替えがものすごく遅くなっていたりしますか?
> > 
> > ruby 1.9.2dev (2009-09-19) [i686-linux] で試していたのですが,
> > 次のスクリプト (1) であれば,1.8 と同様にすぐにウィンドウが出ます.
> > ですが,
> > -----(2)-----------------------------------------------------
> > 
> > -----(3)-----------------------------------------------------
> > ではとんでもなく遅くなってしまいます.
> 
> 手元で試した限り、linuxでlocalhost、あるいはMac OS Xでmactkでは
> 差はわかりません。ただ、linuxからOS XのX11に出すときには(1)と
> (3)では6~7秒程度なのに対して(2)は十数秒近くかかりました。

そうですか.
手元の環境が古いことによる違いもあるのかもしれませんね.
ちなみに手元の環境は Vine 3.2 ベースで kernel は 2.6.15.4,
rpm -q glibc の答えは glibc-2.3.3-3vl1.3 です.

こちらでは 1.8 や (1) では 1 秒以内に表示を完了するのに対し,
(2) や (3) は表示完了までに 5 秒程度かかります.
別マシンの X に表示させる場合については,
このメールを書いている現在は 2nd マシンがなく,
テストできる環境にありません.

以下は念のためですが.Ruby/Tk において
TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD == true の場合というのは
イベントループの実体が Tk.mainloop で動いている状態です.
この時には Thread.new{Tk.mainloop} などとして
メインスレッド以外で Tk.mainloop を動かすようなことは許されません.

そうでない場合 (1.9 でのデフォルト) には,
tk.rb の require 時にイベントループの実体となるスレッド
(Tk インタープリタの初期化も同スレッド上で行われる) を起動しておき,
Tk.mainloop は単なる待ちを行うだけとなっています.

このようになっている理由は,
Tk は Tk の初期化を行った native thread 上でしか
正しく動作しないためです.

イベントループとは異なる native thread からの呼び出しは
イベントループの native thread に送られて処理されます.
もちろん,処理を依頼した方の native thread は
結果を受け取るまで待ち状態となります.
サンプル (2) と (3) とはこの状態です.
-- 
永井 秀利  (nagai / ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門