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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|