Talk About Network



Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > Perl Cvs P5ee > [svn:p5ee] r103...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 1 of 1 Topic 626 of 694
Post > Topic >>

[svn:p5ee] r10349 - p5ee/trunk/App-Context/lib/App/Context/POE

by spadkins@[EMAIL PROTECTED] Dec 3, 2007 at 08:21 AM

Author: spadkins
Date: Mon Dec  3 08:21:16 2007
New Revision: 10349

Modified:
   p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm

Log:
fixing the pile up during splitting

Modified: p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm
==============================================================================
--- p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm	(original)
+++ p5ee/trunk/App-Context/lib/App/Context/POE/Server.pm	Mon Dec  3
08:21:16 2007
@[EMAIL PROTECTED]
 -17,6 +17,7 @[EMAIL PROTECTED]
 use Sys::Hostname;
 use Date::Format;
 use Date::Parse;
+use Time::HiRes qw(gettimeofday tv_interval);
 
 use POE;
 use POE::Component::Server::SimpleHTTP;
@[EMAIL PROTECTED]
 -440,35 +441,39 @[EMAIL PROTECTED]
 sub dispatch_pending_async_events {
     &App::sub_entry if ($App::trace);
     my ($self, $max_events) = @[EMAIL PROTECTED]
    #$self->log({level=>2},"S: dispatch_pending_async_events : enter :
max_events=[$max_events]\n") if $self->{options}{poe_trace};
+    my $t0 = [gettimeofday];
+    #$self->log({level=>2},"S: dispatch_pending_async_events : poe_state
: \n" . $self->_state_poe() . "\n");
+    $self->log({level=>2},"S: dispatch_pending_async_events : enter :
max_events=[$max_events]\n") if $self->{options}{poe_trace};
     #$self->log({level=>2},"S: dispatch_pending_async_events :
pending_async_events : " . Dumper($self->{pending_async_events}) . "\n")
if $self->{options}{poe_trace};
+
     $max_events ||= 9999;
     my $pending_async_events = $self->{pending_async_events};
-    my ($async_event, $assigned, $event, $in_process);
+    my ($async_event, $assigned, $event, $in_process, %unique_events);
     my $events_occurred = 0;
     my $i = 0;
     my $event_capacity_exists = 1;
     my $max_i = $#$pending_async_events;
     while ($i <= $max_i && $events_occurred < $max_events) {
-        #$self->log({level=>2},"S: dispatch_pending_async_events :
i/max_i=[$i/$max_i] : pending_async_events=[$#$pending_async_events]\n")
if $self->{options}{poe_trace};
         $async_event = $pending_async_events->[$i];
         $event = $async_event->[0];
         if ($event->{destination}) {
-            #$self->log({level=>2},"S: dispatch_pending_async_events :
destination=[$event->{destination}]\n") if $self->{options}{poe_trace};
             $self->send_async_event_now(@[EMAIL PROTECTED]
);
             $events_occurred ++;
             splice(@[EMAIL PROTECTED]
 $i, 1);  # remove
$pending_async_events->[$i]
             $max_i--;
+
+            $unique_events{"$event->{name} $event->{method}"}++;
         }
         elsif ($event_capacity_exists) {
             $assigned = $self->assign_event_destination($event);
-            #$self->log({level=>2},"S: dispatch_pending_async_events :
assigned=[$assigned]\n") if $self->{options}{poe_trace};
             if ($assigned) {
                 $self->send_async_event_now(@[EMAIL PROTECTED]
);
                 $events_occurred ++;
                 # keep $i the same
                 splice(@[EMAIL PROTECTED]
 $i, 1);  # remove
$pending_async_events->[$i]
                 $max_i--;
+
+                $unique_events{"$event->{name} $event->{method}"}++;
             }
             else {   # [undef] no servers are eligible for assignment
                 $event_capacity_exists = 0;   # there's no sense looking
at the other pending async events
@[EMAIL PROTECTED]
 -479,8 +484,15 @[EMAIL PROTECTED]
             $i++;   # look at the next one
         }
     }
+    my $sum_not_clear_pending_events = 0;
+    for my $key (keys %unique_events) {
+        if ($key ne "mvworkd _clear_pending_hotel_shop_requests") {
+            $sum_not_clear_pending_events += $unique_events{$key};
+        }
+    }
+
+    $self->log({level=>2},"S: dispatch_pending_async_events : exiting :
events_occurred=[$events_occurred]
events_not_clear_pending=[$sum_not_clear_pending_events] time=[" .
sprintf("%.4f", tv_interval($t0, [gettimeofday])) . "]\n") if
$self->{options}{poe_trace};
     &App::sub_exit($events_occurred) if ($App::trace);
-    #$self->log({level=>2},"S: dispatch_pending_async_events : exiting :
events_occurred=[$events_occurred]\n") if $self->{options}{poe_trace};
     return($events_occurred);
 }
 
@[EMAIL PROTECTED]
 -836,6 +848,42 @[EMAIL PROTECTED]
     return;
 }
 
+sub poe_yield {
+    &App::sub_entry if ($App::trace);
+    my ($self, $kernel, $state, $max_count) = @[EMAIL PROTECTED]
    $max_count ||= 1;
+    if (!defined($self->{poe_count}{$state})) {
+        $self->{poe_count}{$state} = 1;
+    }
+    else {
+        $self->{poe_count}{$state}++;
+    }    
+    if ($self->{poe_count}{$state} <= $max_count) {
+        $kernel->yield($state);
+    }
+
+    #$self->log({level=>2},"POE: poe_yield : poe_count : " .
Dumper($self->{poe_count}) . "\n");
+    &App::sub_exit() if ($App::trace);
+    return;
+}
+
+sub poe_yield_acknowledged {
+    &App::sub_entry if ($App::trace);
+    my ($self, $state) = @[EMAIL PROTECTED]
    if ($self->{poe_count}{$state}) {
+        $self->{poe_count}{$state}--;
+    }    
+    else {
+        $self->{poe_count}{$state} = 0;
+    }
+
+    #$self->log({level=>2},"POE: poe_yield_acknowledged : poe_count : " .
Dumper($self->{poe_count}) . "\n");
+    &App::sub_exit() if ($App::trace);
+    return;
+}
+
 sub poe_sigterm {
     &App::sub_entry if ($App::trace);
     my ( $self, $kernel, $heap, $signame ) = @[EMAIL PROTECTED]
 OBJECT, KERNEL, HEAP,
ARG0 ];
@[EMAIL PROTECTED]
 -867,13 +915,14 @[EMAIL PROTECTED]
     my $sig     = $status & 255;
     $self->log({level=>2},"POE: poe_sigchld (Child $pid finished
[exitval=$exitval,sig=$sig])\n") if $self->{options}{poe_trace};
     $self->finish_pid($pid, $exitval, $sig);
-    $kernel->yield("poe_dispatch_pending_async_events");
+    $self->poe_yield($kernel, "poe_dispatch_pending_async_events");
     &App::sub_exit() if ($App::trace);
 }
 
 sub poe_alarm {
     &App::sub_entry if ($App::trace);
     my ( $self, $kernel, $heap ) = @[EMAIL PROTECTED]
 OBJECT, KERNEL, HEAP ];
+    #$self->log({level=>2},"S: poe_alarm : poe_state : \n" .
$self->_state_poe() . "\n");
     $self->log({level=>2},"POE: poe_alarm (Dispatching pending events and
queueing scheduled events)\n") if $self->{options}{poe_trace};
     my $main_service = $self->{main_service};
     if ($self->{options}{poe_trace}) {
@[EMAIL PROTECTED]
 -881,11 +930,12 @[EMAIL PROTECTED]
             if ($main_service &&
$main_service->can("format_async_event")) {
                 my ($event, $callback_event) = @[EMAIL PROTECTED]
                 my $str = $main_service->format_async_event($event,
$callback_event);
-                $self->log({level=>2},"POE: poe_alarm :
pending_async_events : $str\n");
+                #$self->log({level=>2},"POE: poe_alarm :
pending_async_events : $str\n");
             }
         }
     }
     $kernel->yield("poe_dispatch_pending_async_events");
+    $self->poe_yield($kernel, "poe_dispatch_pending_async_events");
     my $time = time();
     my (@[EMAIL PROTECTED]
);
     my $events_occurred = 0;
@[EMAIL PROTECTED]
 -894,7 +944,7 @[EMAIL PROTECTED]
         $time_of_next_event = $self->get_current_events(\@[EMAIL PROTECTED]
 $time);
         if ($#events > -1) {
             foreach my $event (@[EMAIL PROTECTED]
) {
-                $self->log({level=>2},"POE: poe_alarm :
yield(poe_run_event, $event)\n");
+                #$self->log({level=>2},"POE: poe_alarm :
yield(poe_run_event, $event)\n");
                 $kernel->yield("poe_run_event", $event);  # put on the
POE run queue
                 $events_occurred++;
             }
@[EMAIL PROTECTED]
 -944,8 +994,13 @[EMAIL PROTECTED]
     &App::sub_entry if ($App::trace);
     my ( $self, $kernel, $heap ) = @[EMAIL PROTECTED]
 OBJECT, KERNEL, HEAP ];
     $self->log({level=>2},"POE: poe_dispatch_pending_async_events\n") if
$self->{options}{poe_trace};
+
+    $self->poe_yield_acknowledged("poe_dispatch_pending_async_events");
     my $events_occurred = $self->dispatch_pending_async_events();
-    $kernel->yield("poe_dispatch_pending_async_events") if
($events_occurred > 0);
+    ### These are currently causing our serious slowness during lots of
splitting, fix the dogpile problem!
+    #$kernel->yield("poe_dispatch_pending_async_events") if
($events_occurred > 0);
+    $self->poe_yield($kernel, "poe_dispatch_pending_async_events") if
($events_occurred > 0);
+
     &App::sub_exit() if ($App::trace);
 }
 
@[EMAIL PROTECTED]
 -969,7 +1024,8 @[EMAIL PROTECTED]
         }
     }
     if ($async_event_added) {
-        $kernel->yield("poe_dispatch_pending_async_events");
+        #$kernel->yield("poe_dispatch_pending_async_events");
+        $self->poe_yield($kernel, "poe_dispatch_pending_async_events");
         $kernel->yield("poe_event_loop_extension");
     }
     else {




 1 Posts in Topic:
[svn:p5ee] r10349 - p5ee/trunk/App-Context/lib/App/Context/POE
spadkins@[EMAIL PROTECTED  2007-12-03 08:21:18 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Wed May 14 23:22:16 CDT 2008.