我有一个multithreded应用程序在perl为我必须依赖几种非线安全的模块,这样我已经被使用 fork()ed过程 kill() 信号的消息传递的接口。

问题是,信号处理程序是一点不稳定(至少),并常常最终与进程被打死在inapropriate国。

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

有帮助吗?

解决方案

查看 forks.pm , “使用fork()”的“Perl线程的直接替换”这使得更合理的内存使用(但不要在Win32上使用它)。它允许您声明“共享”变量然后它会自动传递进程之间对这些变量所做的更改(类似于threads.pm的工作方式)。

其他提示

取决于什么你的计划需要做的,你可以考虑使用 POE, ,这是一个Perl框架的多应用程序的用户的空间线。它是复杂的,但是优雅和强大的和可以帮你避免非线安全的模块的限制的活动以一个单一的Perl解释线。

有用资源的开始:

  • 编程坡 介绍马特警长(从这里开始理解它是什么,它是不会)
  • POE项目页 (很多菜谱中的例子)

另外还有数以百计的预先建立 POE件 你可以用来组装到一个应用程序。

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

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

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

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

如果要使用非线程安全的模块,通常可以在线程入口点内使用require和import加载它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top