gevent学习2- 并行ping

本文探讨了使用gevent改造ping.py实现并行ping时遇到的问题,包括数据错误和可能的select模块patch不完善的原因。同时,通过对比gping模块的实现,展示了如何正确地进行并行ping操作。最后,分析了gevent的patch功能的局限性,为开发者提供了一种更可靠的并行ping解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面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不够完善?

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值