At 01:14 AM 7/16/02 +0000, Stas Bekman wrote: >>Hmmm... I guess you're right. I hadn't thought of applying Thread::Pool >>in this situation, but it sure makes sense. This would however imply >>that jobs would be submitted from different threads. That _should_ work, >>but I just realised that I don't have a test-case for that. Will work on >>one and let you know the result. >I think that's a reverse case, the pool creates the dbh items (tools) and >workers pick the items use them and then put back when they are done with >them. So it's the pool who creates the "things".
Hmm... but you won't be able to "fetch" the $dbh from the thread. It can only live in _that_ thread. You cannot "pass" objects between threads. But you _can_ send queries to that thread, fetch a jobid for that job and then obtain whatever was returned as a Perl datastructure. (if anyone knows of a way to pass objects between threads, I'd really would like to know) With Thread::Pool you would do something like this: use Thread::Pool; my $pool = Thread::Pool->new( { workers => 10, pre => \&pre, do = \&do, }, database parameters ); @result = $pool->wait( query parameters ); sub pre { my $dbh = (make database connection with @_); # maybe "prepare" any statements return $dbh; } sub do { my $pool = shift; my ($dbh) = $pool->pre; # do whatever you want to do in the database, dependent on @_ # could be any standard list, data-structure, etc, but _not_ an object! return @result; } >btw, one thread should be able to pick more than one item at once. but in >this particular case of DBI, I think there should be a different pool for >each connectin group. similar to what Doug has suggested in his original >TIPool prototype in the overview doc. Thread::Pool doesn't work that way. You could have 1 database connection in one worker thread and 40 threads submitting jobs: they would be handled in the order they were submitted. This effectively serializes access (which could be an approach for DBI drivers that do not support _any_ threading at all). Or you could have 10 worker threads with 40 threads submitting jobs. That would work faster if your database is threaded as well ;-) Liz