[#954] Rational — keiju@... (Keiju ISHITSUKA)

けいじゅ@SHLジャパンです.

23 messages 1996/10/30
[#955] Re: Rational — matz@... (Yukihiro Matsumoto) 1996/10/30

まつもと ゆきひろです.

[#968] Re: Rational 1996/10/31

けいじゅ@SHLジャパンです.

[ruby-list:766] Re: httpd.rb (Re: sample/svr.rb (socket, select))

From: Shin-ichiro Hara <sinara@...>
Date: 1996-10-07 03:22:44 UTC
List: ruby-list #766
原です。

> # socket example - server side using thread
> # usage: ruby tsvr.rb
> 
> require "socket"
> require "thread"
> 
> gs = TCPserver.open(0)
> addr = gs.addr
> addr.shift
> printf("server is on %d\n", addr.join(":"))
> 
> while TRUE
>   ns = gs.accept
>   print(ns, " is accepted\n")
>   Thread.start do
>     s =	ns			# save to dynamic variable
>     while s.gets
>       s.write($_)
>     end
>     print(s, " is gone\n")
>     s.close
>   end
> end
> 
> 短いですね。でもこれを書いてみたら,Socket#acceptがthread対
> 応になっていませんでした。次のリリース以降でしか動きませんね。


ああ、そうか。accept でブロックしてしまう心配は、Thread でコネク
ションごとの処理をまとめてしまえば無用なんだ。accept が thread
対応になっていないという意味が分からなかったけど。(^^;


> 原さんのsvr.rbが何をしているのか良く分からなかったのですが
> (特にsyncronizeのあたり),threadに関して一般的に言えるのは

> 自分から実行権を渡すためにはThread.passを使うと思います。
> sleepしちゃうと寝てしまいますから。

sleep の間は CPU の占有時間(というのだろうか?)が小さくなら
ないのですか?

私のは同時に動かす Thread の数を $max_thread で制限しています。
ですから、この制限つき tsvr.rb はこんな風になるでしょうか。

-------------------------------------------------------------^
# socket example - server side using thread
# usage: ruby tsvr.rb

require "socket"
require "thread"

max_thread = 4

gs = TCPserver.open(0)
addr = gs.addr
addr.shift
printf("server is on %d\n", addr.join(":"))

m = Mutex.new
threads = 0

while TRUE
  ns = gs.accept
  print(ns, " is accepted\n")
  Thread.pass while threads >= max_thread
  m.syncronize{ threads += 1 }
  Thread.start do
    s =	ns			# save to dynamic variable
    while s.gets
      s.write($_)
      m.syncronize{ threads -= 1 }
    end
    print(s, " is gone\n")
    s.close
  end
end
-------------------------------------------------------------$


>   * threadを使うことによって処理全体が高速化されることは絶対
>     にない
> 
> ということです。特にrubyのthreadは毎回スタックをコピーしてい
> ますので,あまり軽くないですから。じゃあthreadを使うメリット
> はないのかというと,ブロックすることがなくなるのでインタラク
> ティヴなプログラムの反応時間が速くなることが期待できることで
> しょう。

わかりました。多分 Thread は http server には向いていますね。


                           Shin-ichro Hara(Nagaoka Univ.of Tech.)

In This Thread

Prev Next