use threads;;
{
package junk;
sub new{bless [], $_[0] }
sub method{ printf __PACKAGE__ . ": @_" }
}
$o = junk->new;;
async{ sub{ $o->method( qw[ the quick brown fox ] ) } };;
## No output!
async \&junk::method, $o, qw[ the quick brown fox ];;
#outputs
junk: junk=ARRAY(0x1adcdec) the quick brown fox
Likewise your second:
... setup as above
async( $obj->can("method"), $obj, qw[ the quick brown fox ] );;
[Type of arg 1 to threads::async must be block or sub {} (not subrouti
+ne entry) at ...
Either of these do:
async sub{ $o->method( qw[ the quick brown fox ] ) };;
junk: junk=ARRAY(0x1b7d5a4) the quick brown fox
async{ $o->method( qw[ the quick brown fox ] ) };;
junk: junk=ARRAY(0x1c1b4a4) the quick brown fox
But I'm not sure that there is any benefit to the extra level of indirection.
In particular, I'm still unsure how usable objects across threads are. They now work for (some) simple cases where they did not in the early days, but I'm still uncertain that they will work properly for all cases. If the object is closed over as in most of the cases above, things seem to function because the object is subject to cloning.
But if you want to pass an object to a thread, where the object was created after the thread was spawned, or even the class was loaded after the thread was spawned, I think you're in for some surprises.
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|