有没有办法在Perl中拥有托管进程(即实际可用的线程替换)?
问题描述:
我在perl中有一个多线程应用程序,我必须依赖几个非线程安全模块,所以我一直使用fork()
ed进程和kill()
信号作为消息传递接口。有没有办法在Perl中拥有托管进程(即实际可用的线程替换)?
问题是信号处理程序有点不稳定(至少可以这么说),并且通常最终会遇到在不合适状态下被杀的进程。
有没有更好的方法来做到这一点?
答
看看forks.pm,这是一个“使用fork()替代Perl线程的嵌入式替代品”,它使得内存使用更为合理(但不要在Win32上使用它)。它将允许你声明“共享”变量,然后它会自动将这些变量对流程进行的更改(类似于threads.pm的做法)。
答
从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解释器线程中来帮助您避免非线程安全的模块。
有用的资源开始:
- Programming POE呈现马特警长(从这里开始了解它是什么和做)
- POE project page(大量的食谱举例)
加有有数百个预建好的POE components可以用来组装成一个应用程序。