anyevent::snmp+coro

来源:互联网 发布:作图软件大全 编辑:程序博客网 时间:2024/06/08 09:05

anyevent是基于事件和回调的格式,有时候用起来不太方便.

结合coro变成同步方式就容易理解一些.

 

#/usr/bin/env perl#测试anyevent::snmp+coro#测试取多个oiduse Coro;use AnyEvent;use AnyEvent::SNMP;use Net::SNMP;my $cocurrent = 1;    # 并发数#my @todoList = map { "192.168.6." . $_ } (1 .. 254); #my @todoList = ("192.168.6.87","192.168.6.25","192.168.6.45"); #my $oid=".1.3.6.1.2.1.1.3.0";  #sysuptimemy $oid1=".1.3.6.1.2.1.1.1.0";  #sysDescrmy @coro;#my $cv = AnyEvent->condvar;doit() foreach 1..$cocurrent;sub doit{    my $ip = shift @todoList;    return if not defined $ip;     my $sess=Net::SNMP->session (-hostname => $ip,                     -community => "public",                     -timeout => 1,                     -nonblocking => 1,                     -translate   => [-timeticks => 0x0]                     );                        #先取sysuptime                        push @coro, async {     #print "$ip.\n";                                  my $ret=$sess->get_request (           -varbindlist => [ $oid ],           #-varbindlist      => \@oids,            -callback => Coro::rouse_cb       );              #my @result = Coro::rouse_wait;        my ($session) = Coro::rouse_wait;        my $result = $session->var_bind_list();      if (!defined $result) {         printf "ERROR: Get request failed for host '%s': %s.\n",                $session->hostname(), $session->error();                      }      else{          printf "The sysuptime for host '%s' is %s.\n",          $session->hostname(), $result->{$oid};                           #继续取sysDescr           #print "$ip.\n";          #push @coro, async {                                                 my $ret=$sess->get_request (             -varbindlist => [ $oid1 ],             -callback => Coro::rouse_cb           );           my ($session) = Coro::rouse_wait;           my $result = $session->var_bind_list();      if (!defined $result) {         printf "ERROR: Get request sysDescr failed for host '%s': %s.\n",                $session->hostname(), $session->error();                      }      else{          printf "The sysDescr for host '%s' is %s.\n",           $session->hostname(), $result->{$oid1};      }              #}       }              &doit();                    }}      foreach (@coro) {#print "joining\n";$_->join;#print "joined\n";};