Apparently, the script uses only one CPU core, and the machine has four. Is this my code or some other settings? I am new to Perl.
use strict;
use warnings;
use threads;
use threads::shared;
use Thread::Queue;
use DBI();
use File::Touch;
my $databasefile = "/var/www/deamon/new.db";
my $count = touch($databasefile);
my $dbuser = "****";
my $dbpwd = "****";
my $dbhost = "localhost";
my $dbname = "****";
my $max_threads = 16;
my $queue_id_list = Thread::Queue->new;
my @childs;
my $ArrayMonitor = threads->new(\&URLArrayMonitor, $queue_id_list);
sleep 3;
my $CrawlerThreads = ();
for (0 .. $max_threads) {
$CrawlerThreads->[$_] = threads->new(\&NameChecker, $queue_id_list);
}
while ($queue_id_list->pending > 0) {
sleep .01;
}
sleep 1;
foreach my $thr (threads->list) {
if ($thr->tid && !threads::equal($thr, threads->self)) {
sleep .01;
}
}
sub URLArrayMonitor {
my ($queue_id_list) = @_;
my $dbh = DBI->connect("DBI:mysql:database=" . $dbname . ";host=" . $dbhost, $dbuser, $dbpwd, {'RaiseError' => 1});
my $sth = $dbh->prepare("SELECT * FROM ci_users WHERE user_group >= 10 ORDER BY user_id");
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
print "Now checking relian_user_" . $ref->{'user_id'} . "\r\n";
eval {
my $dbuser
= DBI->connect("DBI:mysql:database=user_" . $ref->{'user_id'} . ";host=" . $dbhost, $dbuser, $dbpwd, {'RaiseError' => 1});
my $stuser = $dbuser->prepare("SELECT * FROM ci_address_book WHERE lastchecked=0");
$stuser->execute();
while (my $entry = $stuser->fetchrow_hashref()) {
my @queueitem = ($ref->{'user_id'} . "#" . $entry->{'id'});
$queue_id_list->enqueue(@queueitem);
}
$stuser->finish();
$dbuser->disconnect();
};
warn "failed to connect - $dbuser->errstr" if ($@);
}
$sth->finish();
$dbh->disconnect();
print "List now contains " . $queue_id_list->pending . " records.\n";
sleep 1;
}
sub NameChecker {
my ($queue_id_list) = @_;
while ($queue_id_list->pending > 0) {
my $info = $queue_id_list->dequeue_nb;
if (defined($info)) {
my @details = split(/#/, $info);
my $result = system("/var/www/deamon/NewScan/match_name db=" . $details[0] . " id=" . $details[1]);
my $databasefile = "/var/www/deamon/new.db";
my $count = touch($databasefile);
}
}
return threads->self->tid;
}
source
share