我们用普通同步方式扫描10个端口,用协程(异步)方式扫描1000个端口,对比时间。
1、同步方式代码
#encoding=utf-8#author: walker#date: 2014-07-16#function: 使用同步方式扫描10个端口import time, socket, sysdef task(addr): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(100) try: sock.connect(addr) print('Port ' + str(str(addr[1])) + ' is open') except: pass finally: sock.close()#扫描10个端口def synchronous(): for i in range(0, 10): task(('127.0.0.1', i)) t0 = time.time()synchronous()t1 = time.time()print('time: {}s'.format(t1 - t0))
机器的测试结果为9.0110001564s ≈ 9s 。
2、协程(异步)方式代码
#encoding=utf-8#author: walker#date: 2014-07-16#function: 使用协程(异步)方式扫描1000个端口import gevent.monkeygevent.monkey.patch_socket()import gevent, socket, sys, timedef task(addr): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(100) try: sock.connect(addr) print('Port ' + str(str(addr[1])) + ' is open') except: pass finally: sock.close() #扫描1000个端口def asynchronous(): threads = [] for i in range(0, 1000): threads.append(gevent.spawn(task, ('127.0.0.1', i))) gevent.joinall(threads) t0 = time.time()asynchronous()t1 = time.time()print('time: {}s'.format(t1 - t0))
机器的测试结果为2.08499979973s ≈ 2s 。
用同步方式扫描10个端口需要9s,而用协程扫描1000个端口仅需2s!从代码复杂性来看,asynchronous函数仅比synchronous函数多一行。也就是说协程以同步方式的代码复杂度实现了异步程序的性能!
Windows下使用gevent,建议安装二进制版本,先装greenlet,再装gevent:
相关阅读:
1、
2、
*** * 2014-07-16 ***