#!/usr/bin/perl use strict; use SOAP::Lite; use SOAP::Transport::HTTP; use lib "/web/sieve.net/htdocs"; use Sieve; use threads; use Thread::Queue; my $soap = SOAP::Transport::HTTP::CGI->new( dispatch_to => 'manageSieve' ); $soap->handle(); package manageSieve; sub updateSieveFilter { my ($package, $client_id) = @_; my @users = ({ 'Password' => 'test', 'Login' => 'test1@example.in' }, { 'Password' => 'test', 'Login' => 'test2@example.in' }, { 'Password' => 'test', 'Login' => 'test3@example.in' }, { 'Password' => 'test', 'Login' => 'test4@example.in' }, { 'Password' => 'test', 'Login' => 'test5@example.in' }, ); if(@users) { my $THREADS = 30; my $Qwork = new Thread::Queue; my $Qresults = new Thread::Queue; # If i return any value from here it wokrs. ## Create the pool of workers my @pool = map{ threads->create( \&updateClientUsersSieve, $Qwork, $Qresults ) } 1 .. $THREADS; # Does not return any value from here. foreach my $user (@users){ $Qwork->enqueue( $user ); if( $counter % 100 == 0){ sleep 1; } $counter++; } $Qwork->enqueue( (undef) x $THREADS ); ## Process the results as they become available for ( 1 .. $THREADS ) { while( $result = $Qresults->dequeue ) { #print $result; } } # Clean up the threads $_->join for @pool; return 1; } return 0; } sub updateClientUsersSieve { my $tid = threads->tid; my $result = 1; my( $Qwork, $Qresults ) = @_; my ($login, $password); while( my $user = $Qwork->dequeue ) { ($login, $password) = ($user->{'Login'}, $user->{'Password'}); my $sieveObj = new Sieve($login, $password); $result = $sieveObj->sieveLogin(); $Qresults->enqueue( $result ); } $Qresults->enqueue( undef ); ## Signal this thread is finished } 1;