3

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

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

有一个更好的方法吗?

4

4 回答 4

7

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

有用的入门资源:

此外,还有数百个预构建的POE 组件可用于组装到应用程序中。

于 2008-09-26T14:29:00.717 回答
6

您总是可以在父母和孩子之间建立一个管道来来回传递消息。

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

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

于 2008-09-26T11:11:23.607 回答
4

看看forks.pm,一个“使用 fork() 替代 Perl 线程的替代品”,它可以更合理地使用内存(但不要在 Win32 上使用它)。它将允许您声明“共享”变量,然后它会自动在进程之间传递对此类变量所做的更改(类似于threads.pm 的处理方式)。

于 2008-09-26T14:58:26.997 回答
1

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

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

于 2008-09-26T11:04:10.283 回答