我在 perl 中有一个多线程应用程序,我必须依赖几个非线程安全模块,所以我一直使用fork()
带有信号的 ed 进程kill()
作为消息传递接口。
问题是信号处理程序有点不稳定(至少可以这么说),并且通常最终会导致进程在不适当的状态下被杀死。
有一个更好的方法吗?
我在 perl 中有一个多线程应用程序,我必须依赖几个非线程安全模块,所以我一直使用fork()
带有信号的 ed 进程kill()
作为消息传递接口。
问题是信号处理程序有点不稳定(至少可以这么说),并且通常最终会导致进程在不适当的状态下被杀死。
有一个更好的方法吗?
根据您的程序需要做什么,您可能会考虑使用POE,这是一个用于具有用户空间线程的多线程应用程序的 Perl 框架。它很复杂,但优雅而强大,可以通过将活动限制在单个 Perl 解释器线程中来帮助您避免使用非线程安全模块。
有用的入门资源:
此外,还有数百个预构建的POE 组件可用于组装到应用程序中。
您总是可以在父母和孩子之间建立一个管道来来回传递消息。
pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
close $reader;
...
}
else {
close $writer;
my $msg_from_child = <$reader>;
....
}
不是一种非常舒适的编程方式,但它不应该是“不稳定的”。
看看forks.pm,一个“使用 fork() 替代 Perl 线程的替代品”,它可以更合理地使用内存(但不要在 Win32 上使用它)。它将允许您声明“共享”变量,然后它会自动在进程之间传递对此类变量所做的更改(类似于threads.pm 的处理方式)。
从 perl 5.8 开始,您应该查看核心线程模块。看看http://metacpan.org/pod/threads
如果你想使用不是线程安全的模块,你通常可以在线程入口点使用 require 和 import 加载它们。