2008-09-26 35 views
3

我在perl中有一個多線程應用程序,我必須依賴幾個非線程安全模塊,所以我一直使用fork() ed進程和kill()信號作爲消息傳遞接口。有沒有辦法在Perl中擁有託管進程(即實際可用的線程替換)?

問題是信號處理程序有點不穩定(至少可以這麼說),並且通常最終會遇到在不合適狀態下被殺的進程。

有沒有更好的方法來做到這一點?

回答

4

看看forks.pm,這是一個「使用fork()替代Perl線程的嵌入式替代品」,它使得內存使用更爲合理(但不要在Win32上使用它)。它將允許你聲明「共享」變量,然後它會自動將這些變量對流程進行的更改(類似於threads.pm的做法)。

1

從perl 5.8開始,你應該看看核心線程模塊。看看http://metacpan.org/pod/threads

如果你想使用不是線程安全的模塊,你通常可以在線程入口點內加載require並導入它們。

6

您可以始終在父母和子女之間有一個管道來回傳遞消息。

pipe my $reader, my $writer; 
my $pid = fork(); 
if ($pid == 0) { 
    close $reader; 
    ... 
} 
else { 
    close $writer; 
    my $msg_from_child = <$reader>; 
    .... 
} 

不是很舒服的編程方式,但它不應該是'不穩定的'。

7

根據你的程序需要做什麼,你可以考慮使用POE,這是一個用於帶有用戶空間線程的多線程應用程序的Perl框架。它很複雜,但優雅而強大,並且可以通過將活動限制在單個Perl解釋器線程中來幫助您避免非線程安全的模塊。

有用的資源開始:

加有有數百個預建好的POE components可以用來組裝成一個應用程序。

相關問題