#!/usr/bin/env perl use strict; use warnings; use threads; use Thread::Queue; use IO::Socket; my $nthreads = 20; my $in_file2 = 'rang.txt'; my $work_q = Thread::Queue->new; my $result_q = Thread::Queue->new; sub ip_checker { while ( my $ip = $work_q->dequeue ) { chomp($ip); $host = IO::Socket::INET->new( PeerAddr => $ip, PeerPort => 80, proto => 'tcp', Timeout => 1 ); if ( defined $host ) { $result_q->enqueue($ip); } } } sub file_writer { open( my $output_fh, ">>", "port.txt" ) or die $!; while ( my $ip = $result_q->dequeue ) { print {$output_fh} "$ip\n"; } close($output_fh); } for ( 1 .. $nthreads ) { push( @workers, threads->create( \&ip_checker ) ); } my $writer = threads->create( \&file_writer ); open( my $dat, "<", $in_file2 ) or die $!; $work_q->enqueue(<$dat>); close($dat); $work_q->end; foreach my $thr (@workers) { $thr->join(); } $result_q->end; $writer->join(); #### #!/usr/bin/env perl use strict; use warnings; use Fcntl qw ( :flock ); use IO::Socket; my $in_file2 = 'rang.txt'; open( my $input, "<", $in_file2 ) or die $!; open( my $output, ">", "port.txt" ) or die $!; my $manager = Parallel::ForkManager->new(20); foreach my $ip (<$input>) { $manager->start and next; chomp($ip); my $host = IO::Socket::INET->new( PeerAddr => $ip, PeerPort => 80, proto => 'tcp', Timeout => 1 ); if ( defined $host ) { flock( $output, LOCK_EX ); #exclusive or write lock print {$output} $ip, "\n"; flock( $output, LOCK_UN ); #unlock } $manager->finish; } $manager->wait_all_children; close($output); close($input);