free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2013-02-15) 最新 次の日記(2013-02-21)» /編集

2013-02-20 [長年日記]

§ [program] Perl and Gauche

 CGIで、マルチスレッドで、スクレイピングして、表示するっていうやつのPerl版Gauche版

 ウェブサイト制作の実習なんかで使えると思うけど、超素朴バージョンなので、キャッシュしたりバックエンド作って処理を分けるべき。

 しかし、Win32 Perlではマルチスレッドで頑張るとSEGVすることがある。CygwinのPerlなら問題ない。スレッド中の処理内容や、スレッド数の変更、IOの同時実行をブロックしたりしたけど、ダメ。

 逆にGaucheはMinGWバイナリのほうがまともで、Cygwinで動かすと全部の情報が取得できないっていう感じ。HTTPモジュールのせいか、マルチスレッドのせいか、相互の相性なのか、もしかしてGCされてるとか?デバッグのやり方もよくわからん。call/ccでも並列処理できるらしいけど継続わからん怖い。

 Perlのほうが速いけど、たぶんタイムアウト設定してるからだと思う。Gaucheでやるなら、thread-join!の引数でやらなきゃなくて、そうするとmapが使えなくて面倒。

 しかし再帰関数こんなに書いたの初めてだな。

 追記:同期IOだとそこでブロックされるので、今回のrfc/httpを使った部分はcall/ccでは速くできないようだ。http-getを非同期にできたらいいのか?でも非同期にすると通信が終了終了してるかとか状態を取得する方法がないといけないよな。あとhttp-getに:timeoutとか欲しい。