关于yield实现异步的问题,请大侠解惑

如下代码,按照我自己的理解会把ip.list中所有的IP地址取出来,假设是100个,判断22端口是否开放,一共需要5秒钟就可以判断出这100个IP的状况。然而事实是代码仍然是阻塞的,在22端口不通的情况下,需要5秒后超时才能进行对下一个IP的判断,这里不理解,请大侠不吝指导,非常感谢!

import socket
socket.setdefaulttimeout(5)
def ping(ipp):
    while True:
        ipport = yield
        try:
            conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            conn.connect(ipport)
            conn.close()
                    except Exception as e:
                        print ipp,e 
                    else:
                        print ipp,'OK'
def run():
    a = []    
    with open('ip.list','r') as f:        
        for i in f.readlines():
            ip = i.split()[0]
            port = 22
            a.append((ip,port))
        for i in a:
            task = ping(i)
            task.next()
            task.send(i)

run()


噜噜哒
浏览 390回答 4
4回答

繁花不似锦

yield就是把本来要执行的函数放进队列,然后每次调用取出next,直到队列为空 你可以把yield当成setTimeout(func,delay);

慕神8447489

协程的概念: 用户空间的线程, 可调度的线程, 非抢占式. 即用户空间非抢占式可调度线程.但是协程不是线程, 不可并发, 不具有异步性.即每次都会阻塞在yield处, 但也只是阻塞这一次当前调用, 只有当前调用完成后才会进行下次调用.协程的好处, 个人理解, 是给于我们单线程内实现非线性程序实现.
打开App,查看更多内容
随时随地看视频慕课网APP