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:

use 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"; }
Note: code untested

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
    Thank you SimonPratt, The code you have suggested is very elegant!

      You're welcome :-)

      Not sure if you've noticed, but the solution I provided is capable of having the number of threads dialled up and down very easily. In fact, with very minor modifications, you can even create a non-threaded script (be sure to remove use threads and use Thread::Queue when you do this). I strongly suggest that you do this for testing (make sure to run your full workload, rather than just a print statement) - It will let you know if threading is actually helpful for your workload and if so let you dial in the optimal number of threads pretty rapidly.