- ベストアンサー
Parallel::ForkManagerについて
こんにちは。 ubuntu12.10上でParallel::ForkManagerを利用しようとしていますが、子プロセスのファイルへの書き込みの順序で困っています。 いくつかの実験の結果$iを子プロセスごとに1づつ増やして表示させても 1,2,4,5,3,6,8,9,7・・・となり子プロセスを作った順序で終了しません。 fileへの書き込みを順序良く行わせる方法はありませんか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
並列処理、ってそういうもの(子プロセス同士の実行順番が一定とは限らない)だと思いますが。 順番が重要なら、それを制御する必要があります。 ・親プロセスで結果を受けとって、順番に並べてファイルに出力 ・子プロセス側で、「自分の番」が来るまで、ファイル出力を待つ ・子プロセス1の終了を待って子プロセス2を実行(並列の意味無し) 等
お礼
ながったらしくなったらいけないかなとおもったので書きませんでしたがwww::mecanize::firefoxの起動、それがurlからget, 書き込みとなるなかでまえ2つの時間がかかりすぎ困っています。 ・子プロセス側で、「自分の番」が来るまで、ファイル出力を待つ 方法を初心者レベルで教えていただけませんか?
補足
プログラムは use Web::Scraper; use WWW::Mechanize::Firefox; use URI; binmode STDOUT,":utf8"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $year += 1900 ; $mon += 1 ; $File = "yuma-$year:$mon:$mday:$hour.txt" ; open (file,"> $File") or die 'fail to open file\n'; print "HOW MUCH PAGE\n" ; my $page = <STDIN> ; print "WITEING...\n" ; my $s = scraper { process 'font',sen => 'TEXT'; result 'sen'; }; my $r = scraper { process 'div#content',ren => 'TEXT'; result 'ren'; }; for ($i = 1;$i <= $page;$i) { my $uri = URI -> new ("目的とするURL"); my $mech = WWW::Mechanize::Firefox->new(); $mech->get($uri) ; print file $s->scrape($mech->content) ; print file "\n" ; print file $r->scrape($mech->content) ; print file "\n" ; } print "WITEID\n" ; close (file) ; です。