#!c://perl/bin/perl -w use strict; use warnings; use threads; use threads::shared; use Thread::Queue; use App::Options; use Crawler; use EventListner; use Data::Dumper; my $q = Thread::Queue->new(); my $options = \%App::options; # Get command line options my $page_status = {}; share $page_status; my $page_priorty = {}; share $page_priorty; # Open Listneracks my $event_listner = EventListner->new($q, $page_status, $page_priorty); my $listner_thr = threads->create(sub { $event_listner->listen(); }); $listner_thr->detach(); # Create crawler object my $crawler = Crawler->new($q, $options); $crawler->login(); # Login $crawler->fetch_pages(); # Fetch pages my $threads_count :shared = 0; while (1) { # Get all closed pages and sort on there priorty my @closed_pages = grep { $page_status->{$_} eq 'C' } keys %$page_status; my @priorty_sort_pages = sort {$page_priorty->{$a} <=> $page_priorty->{$b}} @closed_pages; foreach my $page (@priorty_sort_pages) { if ($threads_count < $options->{max_crawlers}) { $threads_count++; $page_status->{$page} = 'O'; $page_priorty->{$page}++; my $thr = threads->create(sub { threads->detach(); $crawler->run($page); $crawler->reset(); unless ($page_status->{$page} eq 'X') { $page_status->{$page} = 'C'; } $threads_count--; }); #if ($thr->is_running()) { sleep($options->{pause}) if $options->{pause}; #} #print "A\n"; } #print "B\n"; } }