gevent学习2- 并行ping

来源:互联网 发布:pano.js 编辑:程序博客网 时间:2024/05/25 23:25

前面stackless因为socket不对的问题被放弃,来看看gevent的表现.

gevent的动人之处也是号称通过gevent.monkey.patch_all()可以实现原有标准库的协程化.

#!/bin/env python# -*- coding: utf-8 -*-##coding=gbk#使用gevent改造ping.py,实现并行ping""" mping.py"""import geventfrom gevent.queue import Queueimport sysimport pingfrom 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 pythonimport gpingdef 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不够完善?

 

 

 

原创粉丝点击