2008-09-26 30 views
3

我在perl中有一个多线程应用程序,我必须依赖几个非线程安全模块,所以我一直使用fork() ed进程和kill()信号作为消息传递接口。有没有办法在Perl中拥有托管进程(即实际可用的线程替换)?

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

有没有更好的方法来做到这一点?

回答

4

看看forks.pm,这是一个“使用fork()替代Perl线程的嵌入式替代品”,它使得内存使用更为合理(但不要在Win32上使用它)。它将允许你声明“共享”变量,然后它会自动将这些变量对流程进行的更改(类似于threads.pm的做法)。

1

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

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

6

您可以始终在父母和子女之间有一个管道来回传递消息。

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

不是很舒服的编程方式,但它不应该是'不稳定的'。

7

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

有用的资源开始:

加有有数百个预建好的POE components可以用来组装成一个应用程序。

相关问题