我在perl中有一個多線程應用程序,我必須依賴幾個非線程安全模塊,所以我一直使用fork()
ed進程和kill()
信號作爲消息傳遞接口。有沒有辦法在Perl中擁有託管進程(即實際可用的線程替換)?
問題是信號處理程序有點不穩定(至少可以這麼說),並且通常最終會遇到在不合適狀態下被殺的進程。
有沒有更好的方法來做到這一點?
我在perl中有一個多線程應用程序,我必須依賴幾個非線程安全模塊,所以我一直使用fork()
ed進程和kill()
信號作爲消息傳遞接口。有沒有辦法在Perl中擁有託管進程(即實際可用的線程替換)?
問題是信號處理程序有點不穩定(至少可以這麼說),並且通常最終會遇到在不合適狀態下被殺的進程。
有沒有更好的方法來做到這一點?
看看forks.pm,這是一個「使用fork()替代Perl線程的嵌入式替代品」,它使得內存使用更爲合理(但不要在Win32上使用它)。它將允許你聲明「共享」變量,然後它會自動將這些變量對流程進行的更改(類似於threads.pm的做法)。
從perl 5.8開始,你應該看看核心線程模塊。看看http://metacpan.org/pod/threads
如果你想使用不是線程安全的模塊,你通常可以在線程入口點內加載require並導入它們。
您可以始終在父母和子女之間有一個管道來回傳遞消息。
pipe my $reader, my $writer;
my $pid = fork();
if ($pid == 0) {
close $reader;
...
}
else {
close $writer;
my $msg_from_child = <$reader>;
....
}
不是很舒服的編程方式,但它不應該是'不穩定的'。
根據你的程序需要做什麼,你可以考慮使用POE,這是一個用於帶有用戶空間線程的多線程應用程序的Perl框架。它很複雜,但優雅而強大,並且可以通過將活動限制在單個Perl解釋器線程中來幫助您避免非線程安全的模塊。
有用的資源開始:
加有有數百個預建好的POE components可以用來組裝成一個應用程序。