At 09:36 AM 7/30/02 +0200, Rafael Garcia-Suarez wrote:
>Elizabeth Mattijsen wrote:
>>Thread::Use - use a module inside a thread only
>>=head1 SYNOPSIS
>> use Thread::Use;
>> threads->new( sub {
>> useit Module;
>> useit Module qw(parameters);
>> noit Module;
>> noit Module qw(parameters);
>> } );
>OK, I looked a bit at this, and I must confess that I don't
>understand how/why it works.
I've finally done it... ;-)
The how is actually by declaring a UNIVERSAL::useit and UNIVERSAL::noit
routine.
>Looks like stashes are not shared between threads. How
>is this related to saving memory ?
Indeed, stashes are not shared between threads. Which is also why
Thread::Needs works: it removes unneeded stashes from the memory in a thread.
However, Thread::Use can also be handy for modules that do not survive the
cloning process, such as PerlIO::gzip and many DBI::DBD modules...
>... (for modules that don't
>export lots of symbols into the caller's namespace).
If you do some memory benchmarks, you'd be surprised to see how much memory
is used by exported symbols. And all of it copied to any thread that is
created. Using significant amounts of CPU and memory. Which becomes
important in many, long running thread situations as mod_perl with the
worker MPM of Apache.
>Does the module gets unloaded in some way when the thread
>ends ?
When a thread starts, a clone of the _entire_ interpreter is made,
including any modules that are loaded. However, any modules that you load
when in the cloned interpreter (thread), are local to that thread
only. The C<useit> merely ensures that the effective C<use> is done at
execution time, rather than at compile time. And if you place a C<useit
Module> inside a thread, then the Module will be C<require>d and its import
executed inside the thread only. And when the thread ends, everything that
was that thread, including the newly loaded module, will be gone again.
>(BTW your module doesn't provide an interface equivalent to
> use Foo ();
> no Bar ();
>--that doesn't call import().)
Indeed. Is there a way to find out whether a subroutine is called without
any parameters or with an empty list? Cause when I can do that, I can
simulate this behaviour as well...
Liz