foreach (@Listeners){
vec($rout,fileno($_),1) or next;
# listener is nonblocking, goes until
# expected accept failure
while (accept(my $NewServer, $_)){
push @Clients, $NewServer
you just do do
foreach (@Listeners){
vec($rout,fileno($_),1) or next;
# listener is blocking, but we
# know this listener is hot
if (accept(my $NewServer, $_)){
push @Clients, $NewServer
}else{ log "accept: $!" }
Or, mock up the accept-em-all-NOW method
without clumsily making accept fail:
foreach (@Listeners){
vec($rout,fileno($_),1) or next;
# listener is blocking, but we
# know this listener is hot
acc:
accept(my $NewServer, $_) and
push @Clients, $NewServer;
# select again to see if there's another
my $rvec;
vec($rvec,fileno($_),1) = 1;
select($rvec,undef,undef,0);
vec($rvec,fileno($_),1) and goto acc;
The difference is
by accepting all connections immediately we
will possibly have more connections going, more suddenly. If
we have a limit on our number of open connections,
we only need to check it once per loop to keep
from overrunning it.
How much can it affect throughput? It's like
asking is it better for an office building to have a one-person
revolving door that spins fast
or a family-size one that spins slow. |