各位兄台,我的需求是这样的:
1. 一共有 100 多台设备,需要每隔 10s 获取一遍信息
2. 主动监控,因为要监控的设备没法编程,不支持 SNMP 的 trap,只支持 snmpwalk 获取 OID 信息
3. 每个设备获取 7 个 OID 信息,其中最后一个最耗时,需要 2.2~2.4s 左右
4. 将返回的信息格式化一下,插入 mysql 数据库
所以,@likuku @
timonwon 兄,被动监控,没法搞啊
我用 gevent 模块测试了一下获取一台机器的信息:
oid_list=['.1.3.6.1.4.1.30966.4.2.1.22',
'.1.3.6.1.4.1.30966.4.2.1.23',
'.1.3.6.1.4.1.30966.4.2.1.24',
'.1.3.6.1.4.1.30966.4.2.1.25',
'.1.3.6.1.4.1.30966.4.2.1.7',
'.1.3.6.1.4.1.30966.4.2.1.13',
'.1.3.6.1.4.1.30966.4.2.1.1' ]
def get_snmp_info(oid,ip):
'''
net-snmp 官方 python 接口:
http://www.net-snmp.org/wiki/index.php/Python_Bindings https://net-snmp.svn.sourceforge.net/svnroot/net-snmp/trunk/net-snmp/python/README '''
return netsnmp.snmpwalk(oid, Version=2, DestHost=ip, Community="public")
start_time=time.time()
threads = []
for oid_text in oid_list:
threads.append(gevent.spawn(get_snmp_info,oid_text,desthost))
gevent.run()
#gevent.joinall(threads)
print time.time()-start_time
问题:
耗时:0.000214099884033
>>> threads[0].value ## spawn() 后,函数并没有在后台执行,没法获取返回值
>>> threads[0].run() ## 需要手动调用 run() 方法进行执行
>>> threads[0].value
('23',)
gevent.spawn() 的 thread 没有执行,需要手动调用 threads[x].run() 方法来触发
这样又和取消 #gevent.joinall(threads) 的注释,效果一样了,不是异步的模式
和同步模式没有区别
耗时:4.58578181267
测试 2台设备 gevent.joinall(threads) 耗时 4.5s 这样子如果并发采集 100
多台,时间不够用
gevent.joinall() 手册描述:gevent.joinall() waits for them to complete
使用 joinall() 方法,就要等待所有的 spawn 的调用都执行完,这种等待是不是一种阻塞