我在同時調用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