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

>>

Reply via email to