• ベストアンサー

Parallel::ForkManagerについて

こんにちは。 ubuntu12.10上でParallel::ForkManagerを利用しようとしていますが、子プロセスのファイルへの書き込みの順序で困っています。 いくつかの実験の結果$iを子プロセスごとに1づつ増やして表示させても 1,2,4,5,3,6,8,9,7・・・となり子プロセスを作った順序で終了しません。 fileへの書き込みを順序良く行わせる方法はありませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

並列処理、ってそういうもの(子プロセス同士の実行順番が一定とは限らない)だと思いますが。 順番が重要なら、それを制御する必要があります。 ・親プロセスで結果を受けとって、順番に並べてファイルに出力 ・子プロセス側で、「自分の番」が来るまで、ファイル出力を待つ ・子プロセス1の終了を待って子プロセス2を実行(並列の意味無し) 等

pipopipoid
質問者

お礼

ながったらしくなったらいけないかなとおもったので書きませんでしたがwww::mecanize::firefoxの起動、それがurlからget, 書き込みとなるなかでまえ2つの時間がかかりすぎ困っています。 ・子プロセス側で、「自分の番」が来るまで、ファイル出力を待つ 方法を初心者レベルで教えていただけませんか?

pipopipoid
質問者

補足

プログラムは 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) ; です。

関連するQ&A