我在同时调用Parallel::ForkManager
和Inline::Java
时遇到问题。具体来说,如果我用JNI => 1
选项(我必须)调用Inline::Java
,那么fork过程不会返回到父项。下面是代码:Inline :: Java与Parallel :: ForkManager冲突
use Parallel::ForkManager;
##### Calling Inline::Java #####
use Inline Java => <<END, JNI => 1;
END
###### End of Inline::Java #####
my $pm = Parallel::ForkManager->new(2);
for my $i (0..1) {
$pm->start and next;
print "Inside process $i\n";
$pm->finish;
}
$pm->wait_all_children;
print "Back to Parent.\n";
如果我运行这个程序,它进入子进程,但从来没有回来父。如果我删除评论之间的3行,它运行良好。如果我将JNI => 1
更改为JNI => 0
(并非我允许为了我的目的而更改该参数),则会出现Lost connection with Java virtual machine at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Inline/Java.pm line 975
的错误消息。
有没有人有线索如何解决冲突?我还必须在并行处理之前调用Inline :: Java,因此在并行完成后使用require
不是一个选项。谢谢!
欣赏你的分析。但是,不幸的是,您的解决方案不适合我实现,正如我在最初的问题结尾处指出的那样,Inline :: Java过程必须在* fork之前执行。顺便说一句,Inline :: Java已经在一个单独的模块中。为了说明的目的,我在这里合并了所有脚本。 – Zhang18
@ Zhang18,再次阅读。我的解决方案并不妨碍您在P :: FM循环之前使用Inline :: Java。你只需要在一个单独的过程中完成。 – ikegami
我明白了 - 你是对的。我没有进入每个子进程来调用JVM,而是设法只进入一个子进程,调用JVM,将结果返回给父进程,然后分叉到许多子进程中。所以关键是永远不要在父项中运行JVM。多谢! – Zhang18