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 )