协程

    协程,又称微线程,纤程,英文名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()