Beekeeper
view release on metacpan or search on metacpan
examples/chat/flood.pl view on Meta::CPAN
my $username = sprintf("bot-%.3d", $n);
push @Bots, MyApp::Bot->new(
username => $username,
on_message => sub {
my (%args) = @_;
return unless $DEBUG;
my $message = $args{'message'};
my $from = $args{'from'} ? "$args{from}:" : ">";
print "$from $message\n";
},
);
}
print "$num_bots clients are sending $msg_sec requests per second.\n";
print "Workers are handling $msg_sec calls per second.\n";
print "Routers are handling " . ($msg_sec * 2) . " messages per second.\n";
print "(press any key to stop)\n";
$| = 1; # autoflush progress dots
while (1) {
print '.';
my $start_on = time();
for (1..$msg_sec) {
my $bot_A = $Bots[rand($num_bots)];
my $bot_B = $Bots[rand($num_bots)];
my $msg = $msg_size ? 'X' x ($msg_size * 1024) : 'Hello ' . $bot_B->username;
$bot_A->talk(
to_user => $bot_B->username,
message => $msg,
);
}
my $cv = AnyEvent->condvar;
AnyEvent::postpone { $cv->send };
$cv->recv;
my $key = ReadKey(-1);
if ($key) {
print "\n";
last;
}
my $took = time() - $start_on;
if ($took > 1) {
my $ovl = int(abs(($took - 1) * 100));
print "Cannot sustain $msg_sec msg/s ($ovl\% overload)\n";
next;
}
my $wait = 1 - $took;
$cv = AnyEvent->condvar;
AnyEvent->now_update;
my $tmr = AnyEvent->timer( after => $wait, cb => $cv);
$cv->recv;
}
1;
( run in 0.934 second using v1.01-cache-2.11-cpan-39bf76dae61 )