2009-10-14 135 views
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 ; 

我正在嘗試使用並行分支管理器模塊訪問並行進程上的全局變量。程序結束時全局變量仍然保持不變。如何實現這一點?是否有可能?Perl如何在並行處理中共享全局變量?

+0

爲什麼你想要分享變量嗎?在開始這個過程之後它們是否改變了? – 2009-10-15 01:08:38

回答

3

如果程序未開始並行處理,則問題將是與第二

my $a = 0; 

線。

但是,由於您正在開始並行進程,因此每個$a都將位於其內存空間中。這意味着每個$a是第一個$a的副本。而最後的第一個$a永遠不會改變,因爲這一點。

從一個進程獲取值到另一個進程需要一些進程間通信。這可以通過插座IPC或其他一些機制來完成。

+0

對不起,我已經編輯過了 – joe 2009-10-14 08:32:36

+0

@joe,你的編輯不會改變任何東西,$ a的範圍仍然是相同的。我或我們的問題,IPC問題依然存在。你的分叉進程正在完成他們的工作,而不會在結束後保存任何可以保存的結果。 – EmFi 2009-10-14 08:39:36

+1

你的改變並不重要,因爲你是分叉的,所有的變量都在不同的過程中。 – 2009-10-14 08:40:34

9

這不是一個範圍界定問題,而是一個不同的過程。 Parallel::ForkManager使用fork()(因此名稱)。這意味着並行運行的每個版本實際上都是一個單獨的進程(對perl解釋器的單獨調用),因此是獨立的內存。這些變量在每個進程中都有相同的名稱,但它們不會指向內存中的相同位置。

如果你想分享整個並行的工人變量,那麼你就需要看看或者使用線程(我不推薦),或使用一些類似IPC::Shareable

0
排序IPC(進程間通信)的

我使用的竅門 - 將叉子過程中的每個變量保存到單獨的txt文件中,而不是在最後(叉子後)只是去搜索所有文件並收集它們(如果不需要,可以刪除文件..