前面stackless因为socket不对的问题被放弃,来看看gevent的表现.
gevent的动人之处也是号称通过gevent.monkey.patch_all()可以实现原有标准库的协程化.
#!/bin/env python
# -*- coding: utf-8 -*-
##coding=gbk
#使用gevent改造ping.py,实现并行ping
"""
mping.py
"""
import gevent
from gevent.queue import Queue
import sys
import ping
from gevent import monkey
#monkey.patch_all()
monkey.patch_socket()
monkey.patch_select()
monkey.patch_time()
ICMP_DATA_STR = 56
#创建函数
def pingip(i):
ip="192.168.6.2%d" % i
print ip
ping.pingNode(alive=0, timeout=1.0, ipv6=0, number=3, \
node=ip, flood=0, size=ICMP_DATA_STR)
#创建协程
nodes = []
for i in xrange(1,6):
nodes.append(gevent.spawn(pingip, i))
#开始运行
gevent.joinall(nodes)
测试结果很遗憾,还是有问题. 不开启patch,顺序执行,结果正确,一旦开启patch,则数据错误
怀疑是select 的patch有问题?
这也许是原有模块的书写不规范,但是至少说明不能盲目信赖gevent的patch功能
换成pypi上的gping模块,则可以正确实现.
#!/bin/env python
import gping
def test_callback(ping):
print ping
gp = gping.GPing()
ips = []
for i in xrange(1,10):
ips.append("192.168.25.%d" % i)
for ip in ips:
gp.send(ip,test_callback)
gp.join()
比较了一下,gping是自己实现的超时判断
而pyping用的select判断超时
说明gevent的selectt patch不够完善?