我在perl中有一个多线程应用程序,我必须依赖几个非线程安全模块,因此我一直使用带有fork()
信号的kill()
ed进程作为消息传递接口。 / p>
问题在于信号处理程序有点不稳定(至少可以说)并且通常最终会导致在不适当的状态下被杀死的进程。
有更好的方法吗?
答案 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加载它们。