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

dsm*_*dsm 3 perl multithreading fork signals

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

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

有一个更好的方法吗?

xdg*_*xdg 7

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

有用的资源入门:

  • 由Matt Sergeant 编写POE演示文稿(从这里开始了解它是什么和做什么)
  • POE项目页面(很多食谱示例)

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


inn*_*naM 6

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

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

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