3
  use Parallel::ForkManager;
  use LWP::Simple;
  my $pm=new Parallel::ForkManager(10);
  our $a =0;
 @LINK=( 10,203, 20, 20 ,20 ,10 ,101 ,01 ,10 ) ;
  for my $link (@LINK) {
    $pm->start and next;
    my $lo = ($link * 120.22 )*12121.2121212121212121*( 12121212.1212121+ $link);
    $a = $a+ $lo ;   
    print $a."\n" ; 
    $pm->finish;
  };

  print $a ; 

並列フォークマネージャーモジュールを使用して、並列プロセスでグローバル変数にアクセスしようとしました。プログラムの終わり、グローバル変数はまだ同じままです..これを達成する方法は?それが可能かどうか?

4

3 に答える 3

9

これはスコープの問題ではなく、さまざまなプロセスの問題です。Parallel::ForkManagerは fork() を使用します (そのため、名前が付けられました)。これは、並行して実行される各バージョンが実際には個別のプロセス (perl インタープリターの個別の呼び出し) であり、したがって個別のメモリであることを意味します。変数は各プロセスで同じ名前になりますが、メモリ内の同じ場所を指すことはありません。

並列ワーカー間で変数を共有したい場合は、スレッドを使用するか (これはお勧めしません)、IPC::Shareableのようなある種の IPC (プロセス間通信) を使用することを検討する必要があります。

于 2009-10-14T13:49:17.717 に答える
3

プログラムが並列プロセスを開始していなかった場合、問題は2番目のプロセスにあります

my $a = 0;

ライン。

ただし、並列プロセスを開始しているため、それぞれ$aがそのメモリ空間にあります。つまり、それぞれ$aが最初ののコピーです$a。そのため、最後の最初のもの$aは決して変更されません。

あるプロセスから別のプロセスに値を取得するには、プロセス間通信が少し必要です。これは、ソケットIPC、またはその他のメカニズムを使用して実行できます。

于 2009-10-14T08:30:49.963 に答える
1

私が使用したトリック-フォークプロセス内のすべての変数を個別のtxtファイルに保存します。最後に(フォーク後)、すべてのファイルを調べて収集します(不要な場合はファイルを消去できます..

于 2010-01-22T20:39:33.183 に答える