有没有办法在Perl中使用托管进程(即实际工作的线程替换)?

时间:2008-09-26 10:52:46

标签: perl multithreading fork signals

我在perl中有一个多线程应用程序,我必须依赖几个非线程安全模块,因此我一直使用带有fork()信号的kill() ed进程作为消息传递接口。 / p>

问题在于信号处理程序有点不稳定(至少可以说)并且通常最终会导致在不适当的状态下被杀死的进程。

有更好的方法吗?

4 个答案:

答案 0 :(得分:7)

根据您的程序需要做什么,您可以考虑使用POE,它是具有用户空间线程的多线程应用程序的Perl框架。它复杂,但优雅且功能强大,可以通过将活动限制在单个Perl解释器线程来帮助您避免非线程安全模块。

有用的资源:

另外,您可以使用数百个预先构建的POE components来组合应用程序。

答案 1 :(得分:6)

您可以在父级和子级之间始终使用管道来回传递消息。

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

不是一种非常舒适的编程方式,但它不应该“不稳定”。

答案 2 :(得分:4)

查看forks.pm,“使用fork()的Perl线程的直接替换”,这使得内存使用更加合理(但不要在Win32上使用它)。它将允许您声明“共享”变量,然后它会自动传递对进程之间的这些变量所做的更改(类似于threads.pm的工作方式)。

答案 3 :(得分:1)

从perl 5.8开始,您应该查看核心线程模块。看看http://metacpan.org/pod/threads

如果要使用非线程安全的模块,通常可以在线程入口点内使用require和import加载它们。