"Thread::Needs" isn't a very descriptive name - it's too general. Something like "Thread::NeedsModules" would be better.
Tim. On Mon, Jul 29, 2002 at 12:51:51AM +0200, Elizabeth Mattijsen wrote: > In the category "really sick, but potentially really useful" modules, I > would like to draw your attention to the Thread::Needs module (available > from CPAN). As usual, I'm interested in whether this makes sense to you > guys or not. For now, it seems to work in the application's I'm using it > in and saves upto 25% memory for the stuff I'm using it for. > > > Liz > ======================================================================= > The uploaded file > > Thread-Needs-0.01.tar.gz > > has entered CPAN as > > file: $CPAN/authors/id/E/EL/ELIZABETH/Thread-Needs-0.01.tar.gz > size: 3960 bytes > md5: e983bbe92b496c3055684f405a8c656a > > =head1 NAME > > Thread::Needs - remove unneeded modules from CLONEd memory > > =head1 SYNOPSIS > > use Thread::Needs; > use Thread::Needs (Config Thread::Pool); > no Thread::Needs (Config); # only if previously in -use- > > =head1 DESCRIPTION > > In many threaded applications, many threads do only very simple things that > do not need many (if any) modules. The current threading module however, > copies all modules that are available at the moment a thread is started, > to the memory of the thread (ensuring an identical environment to the thread > from which it was started). Memory that is not being used and which is > not being shared between processes. In other words, pretty much wasted > memory. > > The C<Thread::Needs> module is an B<experimental> module for reducing the > memory footprint of threaded Perl applications. It attempts to reduce the > amount of memory used by removing B<all> modules, B<except> the ones it is > told to keep, from memory in any threads that are started from the thread > in which C<Thread::Needs> is invoked. > > Please note that this module uses some dirty tricks that may crash your > application, specifically with segmentation faults. A segmentation fault > is usually an indication that a module got removed when it shouldn't have > been. But usually, you will just get an error when a thread starts (or > is already running for a while) indicating the absence of a particular > module. In that case, you just need to add the name of the module to > the list of modules that you need to keep. Beware though that this can be > a process that takes a number of iterations, as one module may be using > other modules that you are not aware of and which are needed anyway. > > Memory savings are greatly dependent on the number and type of modules that > have been C<use>d when a threads is started. It naturally also depends on > the number of threads that are started. Observer memory savings have ranged > from 1% (with only a few modules and only 1 thread) upto more than 25% > (with 100 threads and some modules), effectively making the difference > between having a server go into swap or not on my development machine. > Your Mileage May Vary. > > =head1 CLASS METHODS > > There are only 2 class methods that can be called either explicitely or > implicitely. > > =head2 import > > use Thread::Needs qw(Must::Keep::This::Module); > Thread::Needs->import( qw(Must::Keep::This::Module) ); > > With the "import" class method you can specify additional modules that must > L<not> be removed in any threads that are started from the current thread. > > The "import" method is called implicitely when parameters are specified with > C<use>. > > =head2 unimport > > no Thread::Needs qw(Must::Not::Keep::This::Module); > Thread::Needs->unimport( qw(Must::Not::Keep::This::Module) ); > > With the "unimport" class method you can specify modules that must be removed > from the list of modules to be removed. It only makes sense to call with a > specific module name of it was previously (implicitely) specified with > L<import>. > > The "unimport" method is called implicitely when parameters are specified > with C<no>. > > =head1 EXAMPLE > > A simple example when using Thread::Pool: > > use Thread::Pool; > use Thread::Needs qw(Thread::Pool Thread::Conveyor); > > my $pool = Thread::Pool->new( > { > do => sub { warn "Hello $_[0]!\n" }, > workers => 10, > } > ); > > $pool->job( 'Liz' ); > <>; # Look at "top" when "Hello Liz" is shown > $pool->job( 'Wendy' ); > > With the C<Thread::Needs> the memory usage of the above is B<7928> KByte. > Without it, the memory usage is B<9104> KByte. That's over 1 Mbyte of > memory saved, about 12%. Well, at least on my (Linux) development machine. > > =head1 CAVEATS > > Currently only the namespaces of the modules are zapped. And because the > namespaces need to continue to exist because of the random order in which > CLONE subroutines are executed (otherwise causing segmentation faults), > the namespaces are re-created with just a CLONE stub. Hopefully it will > be possible to also have these removed and even other stuff that namespace > zapping doesn't remove. > > =head1 AUTHOR > > Elizabeth Mattijsen, <[EMAIL PROTECTED]>. > > Please report bugs to <[EMAIL PROTECTED]>. > > =head1 COPYRIGHT > > Copyright (c) 2002 Elizabeth Mattijsen <[EMAIL PROTECTED]>. All rights > reserved. This program is free software; you can redistribute it and/or > modify it under the same terms as Perl itself. > > =head1 SEE ALSO > > L<threads>. > > =cut >