in reply to Redirecting output in Windows cmd prevents second thread from doing anything
My immediate expectation is that when you redirect the output it buffers it, allowing thread 1 to complete the entire workload before thread 2 has had a chance to start (threads take a long time to start in Perl, due to their heavy nature). Yes, the output is also buffered when printing to STDOUT, but \n forces a buffer flush in this instance. You can very easily test this by chucking a sleep into your loop.
Beyond this, I'm not quite sure why you're threading, however a slightly different method of doing the same thing (without having to worry about the dangers of share'ing and lock'ing data structures) would be to use Thread::Queue to pass what is currently being contained in your array.
A solution using Thread::Queue might look something like this:
Note: code untesteduse strict; use warnings; use threads; use Thread::Queue; my $queue = Thread::Queue->new(); my @threads = map {threads->new(\&worker)} 1..2; my @array = qw(2.1.1.1:1.3.1.8.1 ... 2.1.1.1:1.3.1.8.199); $queue->enqueue(@array); # Give work to threads after threads created $queue->end(); # Must do this, otherwise threads will never +end $_->join for @threads; # Join threads to avoid thread errors at end of + script sub worker { my $tid = threads->tid(); print "Starting thread $tid\n"; while (my $oid = $queue->dequeue()) { print "Thread $tid: Doing SNMP GET for $oid\n"; } print "Finishing thread $tid\n"; }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: Redirecting output in Windows cmd prevents second thread from doing anything
by perluser09 (Initiate) on Jan 15, 2016 at 19:20 UTC | |
by SimonPratt (Friar) on Jan 16, 2016 at 08:28 UTC |