That could be it in my case, I am using Inline::Java to use a Java API to access a data product in a FastCGI-like environment. I'll have to look into
it the next time I get a chance. Thanks. On Tue, 4 Jan 2011 08:23:04 -0500, Patrick LeBoutillier <patrick.leboutill...@gmail.com> wrote: > Hi, > > If you fork you have to use reconnect_JVM, or else you will run into > trouble eventually. What will happen is that all the processes will > use the same socket connection the JVM, and eventually things will get > messed up. > > However, Java objects created from a Perl process can't be accessed > directly by other processes using Inline::Java. This is meant to be a > minimal security mechanism when using SHARED_JVM mode. It helps keep > each Perl processe's Java objects somewhat separate. > > If you really want to keep your current design, you will have to keep > your objects on the Java side in an array and access them indirectly. > That way the objects references remain in Java-land and can re-fetched > by the different threads. Here's an example: > > use Inline ( > Java => 'DATA', > SHARED_JVM => 1, > PORT => 17891, > ) ; > Inline::Java::capture_JVM() ; # Kill JVM on exit > > my $nb = $ARGV[0] || 5 ; > for (my $i = 0 ; $i < $nb ; $i++){ > test->make_test($i) ; > } > > $starttime = time; > for (my $i = 0 ; $i < $nb ; $i++){ > my $pid = fork; > if (! $pid) > { > print "start $i\n"; > Inline::Java::reconnect_JVM() ; > my $test = test->get_test($i) ; > $test->sleep() ; > print "end $i\n"; > exit; > } > else > { > push @pid, $pid; > } > } > > waitpid $_,0 for @pid; > > $elapsed = time-$starttime; > print "For $nb threads it took $elapsed seconds\n"; > > __DATA__ > __Java__ > import java.util.* ; > > class test { > static ArrayList tests ; > static { > tests = new ArrayList() ; > } > > static public void make_test (int i) { tests.add(i, new test()) ; } > static public test get_test (int i) { return (test)tests.get(i) ; } > private test() { } > public void sleep() throws InterruptedException { > Thread.sleep(1000) ; > } > } > > > Patrick > > > On Mon, Jan 3, 2011 at 3:59 PM, ant <a...@suave.net> wrote: >> >> >> I made this work by turning off SHARED_JVM (because after a while it >> seemed >> to cause problems) and then loading the module that had Inline::Java in >> it >> at runtime in an eval instead because reconnect_JVM didn't seem to work >> right at all. >> >> so basically I did >> fork(); >> eval "use My::Module;"; >> >> I'll be interested to see if you get a better solution. >> >> On Mon, 3 Jan 2011 12:53:37 -0600, <scott.dav...@wellsfargo.com> wrote: >>> Hi Patrick, >>> >>> Thanks for writing back! I am calling from Perl to Java only. Here is a >>> closer example to what I am doing. I want to create several objects in >> the >>> main process, and then execute methods in parallel in sub-processes. >> There >>> are several steps to what I am doing, and I want to ensure that the >>> first >>> step completes on all target servers before moving on to the second >>> step, >>> and so forth. >>> >>> use Inline ( >>> Java => 'DATA', >>> SHARED_JVM => 1, >>> PORT => 17891, >>> ) ; >>> Inline::Java::capture_JVM() ; # Kill JVM on exit >>> >>> my $nb = $ARGV[0] || 5 ; >>> for (my $i = 0 ; $i < $nb ; $i++){ >>> $test[$i] = new test; >>> } >>> >>> $starttime = time; >>> for (my $i = 0 ; $i < $nb ; $i++){ >>> my $pid = fork; >>> if (! $pid) >>> { >>> print "start $i\n"; >>> #Inline::Java::reconnect_JVM() ; >>> $test[$i]->sleep(); >>> print "end $i\n"; >>> exit; >>> } >>> else >>> { >>> push @pid, $pid; >>> } >>> } >>> >>> waitpid $_,0 for @pid; >>> >>> $elapsed = time-$starttime; >>> print "For $nb threads it took $elapsed seconds\n"; >>> >>> __DATA__ >>> __Java__ >>> class test { >>> public test() { } >>> public void sleep() throws InterruptedException { >>> Thread.sleep(1000) ; >>> } >>> } >>> >>> --------------- >>> >>> $ perl ptest3.pl 2 >>> start 0 >>> start 1 >>> end 0 >>> end 1 >>> For 2 threads it took 2 seconds >>> $ perl ptest3.pl 5 >>> start 0 >>> start 1 >>> start 2 >>> start 3 >>> start 4 >>> end 0 >>> end 1 >>> end 2 >>> end 4 >>> end 3 >>> For 5 threads it took 5 seconds >>> $ perl ptest3.pl 10 >>> start 0 >>> start 1 >>> start 2 >>> start 3 >>> start 4 >>> start 5 >>> start 6 >>> start 7 >>> start 8 >>> start 9 >>> end 0 >>> end 3 >>> end 6 >>> end 1 >>> end 8 >>> end 9 >>> end 5 >>> end 7 >>> end 2 >>> end 4 >>> For 10 threads it took 10 seconds >>> >>> Note that when I uncomment the reconnect_JVM() line, then I get an error >>> message: >>> $ perl ptest3.pl 2 >>> start 0 >>> start 1 >>> Can't find object 1 for thread IJST-#1 at (eval 13) line 215 >>> at ptest3.pl line 24 >>> Can't find object 2 for thread IJST-#2 at (eval 13) line 215 >>> at ptest3.pl line 24 >>> For 2 threads it took 0 seconds >>> >>> Thanks, >>> Scott >>