协程
  195
协程
协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。
协程本质上是个单进程,协程相对于多进程来说,无需线程上下文切换的开销,无需原子操作锁定及同步的开销,编程模型也非常简单。
我们可以使用协程来实现异步操作,比如在网络爬虫场景下,我们发出一个请求之后,需要等待一定的时间才能得到响应,但其实在这个等待过程中,程序可以干许多其他的事情,等到响应得到之后才切换回来继续处理,这样可以充分利用 CPU 和其他资源,这就是异步协程的优势。
协程并发端口扫描
import gevent import telnetlib from gevent import monkey import time monkey.patch_all() ip="192.168.3.1" def scan(port): print("%s创建完成" %port) server = telnetlib.Telnet() # 创建一个Telnet对象 try: server.open(ip,port) # 利用Telnet对象的open方法进行tcp链接 print('{0} port {1} is open'.format(ip, port)) except Exception as err: print('{0} port {1} is not open'.format(ip, port)) finally: server.close() def main(): start_time=time.time() print(start_time) glist=[]
for i in range(21,65535): g1 = gevent.spawn(scan,str(i)) glist.append(g1) gevent.joinall(glist) stop_time=time.time() print(stop_time-start_time) if __name__=="__main__": main()