2011-01-27 32 views
0

嘿,我有一個關於perl對象和線程的問題。Perl對象線程

我的程序是處理日誌的每一行轉換爲對象列表,並且 因此,每個對象可以這樣引用的日誌分析器:獲取存儲

爲值:

print @object[$index]->time; 

output : 01:11:22 

設定值:

@object[$index]->time("01:22:25"); 
print @object[$index]->time; 

output : 01:22:25 

將所有日誌保存到內存後,我將列出一個@objects列表。

所以問題在於對象的處理。

我想通過線程處理數據,我可以在正常的數據上修改字符串,添加總數等。 但是我不知道如何爲對象這麼做。

我要像做

my $thr2 = threads->new(\&processTime, @object); 

(例如是不正確的,只是我想怎麼處理,是一個想法)

因此,因此我需要你們的幫助,以幫助我通過線程處理對象。謝謝

+0

爲什麼你想通過線程處理數據? – ysth 2011-01-27 07:39:51

+0

我將有許多不同的處理模塊/子工具,我希望它們可以同時運行,並且一些日誌可能也很長。對於線程和順序處理的時機,我也是一個實驗。 這些模塊也是某種插件子,所以在我編寫了一個新的處理算法之後,我只需將它插入一個新的線程並運行即可。 – robobooga 2011-01-27 07:42:14

回答

2

如果你想要的只是併發處理,那麼分叉而不是使用線程的問題會少得多。一個流行的分叉庫是Parallel::ForkManager,雖然有其他人。

如果您覺得您必須使用線程,請參見Thread::Queue,但請注意其建議以仔細閱讀threads :: shared錯誤和限制部分,尤其是閱讀example of a share-safe class

而且,在perl5中,數組元素的訪問形式爲$object[$index],而不是@object[$index];後者是一個數組切片,在許多情況下它們的工作原理是一樣的,但效率較低。如果您啓用了警告(您應該),則應該看到有關警告。

0

IIRC perl在多線程使用的任何對象(ref)上進行copy-on-write寫操作,除非對象明確標記爲共享。閱讀threads :: shared perldoc頁面。

+0

在threads :: shared頁面中,他們有這個#不能直接重新映射內部對象18。 #bless($ foo - > {'bar'},'Yang'); 這是否意味着在我的子集中,我無法設置值 @object [$ index] - > time(「01:22:25」); 以這種方式? – robobooga 2011-01-27 08:08:51