フォークにおけるスコープの謎 3
id:kidd-number5さんがフォークにおけるスコープの謎 - ABラボラトリのforkを利用したプログラムをthreadsで実装してくださった。
http://d.hatena.ne.jp/kidd-number5/20070328/1175065357
恥ずかしながらPerlでスレッドを利用したプログラムを始めて見ましたw 別にParallel::UserAgent使う必要ないじゃん、なんて感じたほどシンプルなコードです。後ほど自作更新チェッカをスレッドで書き直してみようと思います。
さて、PerlのThreadについて調べるうちにいろいろわかりましたのでアウトプットしていきます。
Perlのforkとthreadの違い
- PerlのforkとActiveStateのPerlのforkの違い
- 生成できる最大プロセス,スレッド数の比較
- 親で10MBの変数を作ってからの使用メモリの比較
- 親でモジュールをロードしてからの使用メモリの比較
以上の4点についてはhttp://www.ornithopter.jp/archives/2006/03/perl_forkthread.htmlで詳しく解説されていました。
「Perlのfork」と「ActiveStateのPerlのfork」の違いについては、
まず動作普通のPerlとActivePerlのforkの違いについて。
http://www.ornithopter.jp/archives/2006/03/perl_forkthread.html
普通のPerlのforkは正直に子プロセスを作る。(Cygwin)
しかし、ActivePerlはforkをスレッドで実装しているので、プロセスの数は実際には増えない。
とのこと。
フォークにおけるスコープの謎 2 - ABラボラトリ
上記のエントリでわかった問題点の解決への糸口になりそうです。
Parallel::ForkManagerでforkを用いているが、ActiveState版のPerlでは結局threadとして処理するのか。どうりでforkプログラムの実行中、タスクマネージャでPerlの子プロセスを確認できなかったわけだ。
threadにおけるデータの扱い
iスレッドと古い5.005型スレッドの間の(もっといえば、そこから外れる多くのスレッドシステムにとっての)最大の違いは、デフォルトではデータが共有されないという点だ。新しいperlスレッドが生成されるとき、現在のスレッドに関連する全てのデータは新しいスレッドにコピーされる。続いてそのデータは新しいスレッド内でプライベートなものとなる! これはUNIXのプロセスがforkするときに起きることと似ている。ただしこの場合、実際のforkではメモリ上での置き換えが起こるのに対して、このデータは同一プロセッサ内の違うメモリ部分にコピーされるだけであるという点が除かれる。
perlthrtut - Perlにおけるスレッドのチュートリアル - perldoc.jp
ActivePerlがforkをthreadで実装しているなら、この記述でフォークにおけるスコープの謎 2 - ABラボラトリの疑問は解けるな。ActivePerlがデフォルトでfork(thread)を処理したため、データはコピーされ、共有されなかったと。ふむ。
forkの参考ページ
Payday Loans Online UK | £100 to £2,500 Loans in 10 Mins | Xav Loans
自分、あとで読んどけということで。
こうしてみると
id:kidd-number5さんがthreadでの実装を書いてくれたおかげで、問題解決のヒントが多く得られたなあ。kidd-number5さんに感謝。