有没有办法在Perl中管理进程(即实际上有效的线程替换)?

时间:2020-03-06 14:46:38  来源:igfitidea点击:

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

问题在于信号处理程序有点不稳定(至少可以这样说),并且经常以在不适当状态下被杀死的进程结束。

有一个更好的方法吗?

解决方案

从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解释器线程中来避免使用非线程安全的模块。

入门有用的资源:

  • Matt Sergeant编写的POE编程演示(从这里开始了解它的作用)
  • POE项目页面(很多食谱示例)

另外,还有数百种预构建的POE组件,可用于将它们组装到应用程序中。

看看forks.pm,它是"使用fork()替代Perl线程的插件",它使内存使用更为合理(但不要在Win32上使用它)。它将允许我们声明"共享"变量,然后自动在进程之间传递对此类变量所做的更改(类似于thread.pm的工作方式)。