#! perl -sw use strict; use threads; use Thread::Queue; use Time::HiRes qw[ time ]; sub worker { my $Q = shift; while( my $line = $Q->dequeue ) { $line =~ s[a][A]g; print $line; } } print "Started " . scalar locatime; our $T //= 4; my $n = $T -1; my @Qs = map Thread::Queue->new, 0 .. $n; my @threads = map{ threads->create( \&worker, $Qs[ $_ ] ) } 0 .. $n; my $start = time; my $i = 0; while( <> ) { $Qs[ $i ]->enqueue( $_ ); $i = ( $i + 1 ) % $T; warn $., ' ', $. / ( time - $start ) unless $. % 1e6; } $Qs[ $_ ]->enqueue( undef ) for 0 .. $n; $_->join for @threads; print "Ended " . scalar locatime;