軽量言語とネイティブスレッド

ある通信ライブラリをを使ったシミュレータを作成する、というお題がありました。

最初は Ruby で作っていたみたいなのだけれど、Ruby のスレッドは ネイティブスレッドではないので、実現が大変と言うことになってしまいました。

と言うのも、独自の通信プロトコルをサポートするDLLが配布されていて それを使わなければならないのだけれど、これ、メッセージ種別毎に口を開けて待って無くてはなら無くって、求める種別のメッセージがとれるまで返ってこない仕様になってるそうな。

RubyのスレッドはC関数のレベルではノンプリエンプティブになっちゃうから、ちょちょいと DLL を使ってサクサクっと言うわけにはいかない。うーん、困ったぞ・・・というわけで、私に日記のタイトルままの調査依頼(と言うほど堅苦しいものじゃないけど)が舞い込んできました。

うーん、Python の thread モジュールはネイティブスレッドだったな〜、とか思いつつ、とりあえず「Python ネイティブスレッド」で googleってみると、なぜか Ruby 関連のページがザックザク (笑)。YARV とか、次世代 Ruby 周りで ネイティブスレッドがホットなのと、何かと比較対象になりがちな Python なのとの相乗効果ですね。

ひっかがったhttp://pub.cozmixng.org/~the-rwiki/index.rb?cmd=view;name=Ruby%A4%CE%A5%B9%A5%EC%A5%C3%A5%C9というページからのリンクに ruby-talk各スクリプト言語のスレッドの比較という まさにドンピシャな発言がありました。PythonPerl、Tcl、RubyJavascriptJython のスレッドについて簡単な説明があって、それを超訳したものをそのまま調査レポートとして提出してしまいました。Paul Prescod さん、感謝です。(←悪い学生のようだなぁ)

Python部分だけ抜き出すと、

Python のスレッドは、ネイティブスレッドで、一時に1つのスレッドしか Python インタプリタにアクセスできない仕組み。
この仕組みは モノプロセッサマシンじゃ、ほとんど問題にならないけど、マルチプロセッサだと結構問題になるね。

とのこと。ネイティブスレッドだ、と言うことしか知らなかったけど、そういう仕組みになってたんですね〜。