thank you very much for your precious advice, and the example code. to give you an update on my code, as i've done it so far:
sub event_handler {
my $worker_thread = sub {
my $row = shift;
my $event = SOD::EventCooker->new($row);
if (exists $p_ids{$row->{'ev_p_id'}}) {
lock $sessions{$p_ids{$row->{'ev_p_id'}}};
my $session = thaw sessions{$p_ids{$row->{'ev_p_id'}}};
$event->evaluate($session->{PLAYER}->{GAMESTATS});
$sessions{$p_ids{$row->{'ev_p_id'}}} = freeze $session;
}
else {
$event->evaluate;
}
};
my $dist_thread = sub {
my @threads;
my $thread_time = time;
my $dbh = DBI->connect("DBI:mysql:database=$appdata{DBBASE}"
+, $appdata{DBUSER}, $appdata{DBPASS},
{ RaiseError => 1, AutoCommit => 1 }) || die $dbh->errstr;
my $res = $dbh->selectall_hashref("SELECT * FROM event WHERE
+ ev_time<=$thread_time", 'ev_time');
$dbh->do("DELETE FROM event WHERE ev_time<=$thread_time");
map {
push @threads, threads->new($worker_thread->($res->{$_})
+);
} sort keys(%$res);
map {
$_->detach;
} @threads;
$dbh->disconnect;
undef $dbh;
};
while (1) {
sleep 1;
last if $tflag;
threads->new($dist_thread)->detach;
}
}
i assume that a combination of our two approaches might be sufficient even for time of high traffic & loads.
language is a virus from outer space.