おれは秘かに fcgi.rb のメンテナでもあったのだー。はははははは
……メンテするプログラム多すぎだって、マジで。
fcgi.rb をマルチスレッド対応すんのは、確かすげー簡単なんだよ。 @default_parameters['FCGI_MAX_REQS'] に 1 以上の値を入れて、 FCGI#each_request の yield でスレッドを起こせばいい。
と思ってコードを眺めてたら、 マルチスレッドの話はその通りだったが、 graceful exit の条件が完璧に間違ってたことに気付いた。 これでは全然 graceful じゃない。
まあそれはあとで直すとして、スレッドのほうについて考える。 #each を使うのをあきらめて #finish を復活させると スレッド起動部分を外に出せるな。 そのほうがいいような気もする。 YARV 後だとスレッドプールを使いたいこともあるだろうし。 よし、思いたったが吉日で即導入。
(02:49)
いや、嘘だった。俺が嘘だった。 やっぱシングルスレッドの graceful exit はこれでいいんだ。 マルチスレッドになるとちょっと変える必要があるってだけだ。
(02:53)
ああそういえば、俺がメンテしてるのは pure Ruby なfcgi.rb だけね。 fcgi.so は別の話。 gem がどうなってるのか知らんのだけど、どっちなんだろうね。
(03:32)
あれ? libfcgi 2.4.0 は MAX_CONNS=1, MAX_REQS=1 に固定されてるな。 もしかしてネイティブの libfcgi ってマルチスレッド対応してないのか? なんかそれもちょっと考えづらいのだが。 どっか別のところにソースがあったりする?
(04:10)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
fcgi.soはネィティブな意味でのスレッドセーフにしたつもり。
fcgi.rbまではちょっと手がまわらない。
体調回復したらメンテナンスに復帰します。
もうちょっとの間お願いします。ほんとすみません。
いえいえ、fcgi.rb は自分でも使ってるので別に気にしませんよ。数が多すぎるのは自分の責任ですから。
それはともあれ、確かに fcgi.so はスレッドセーフにはなっているようですが、FastCGI プロセス自体が (まだ) マルチスレッドで動いていませんよね。ラップしている libfcgi が MAX_CONNS=1, MAX_REQS=1, MPXS_CONNS=0 固定ですから。