有没有办法在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的工作方式)。