sub DBthread { my( $Qin, $Qout ) = @_; my $dbh = DBI->create( ... ); while( my( $tag, $request ) = split ' : ', $Qin->dequeue ) { my $sth = $dbh->prepare( $request ); my $response = $sth->execute; $Qout->enqueue( "$tag : $response ); } } my( $QtoDB, $QfromDB ) = map{ new Thread->Queue } 1 .. 2; my $threadDB = threads->create( \&DBthread, $QtoDB, $QfromDB ); ... my $listener = new IO::Socket( .. ); my $sel = new IO::Select; my $sel->add( $listener ); my %clients; while( 1 ) { ... for my $fh ( $sel->can_read ) { if( $fh == $listener ) { my $client = $listener->accept; $sel->add( $client ); } else { $fh->recv( $buf, 100 ); ... $QtoDB->enqueue( "$fh : select something from somewhere" ); $clients{ $fh } = $fh; } while( $QfromDB->pending ) { my( $tag, $response ) = split ' : ', $QfromDB->dequeue; my $clientFH = $clients{ $tag }; $clientFH->send( $response ); $clientFH->shutdown( 2 ); $sel->delete( $clientFH ); } } }