为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2018-07-16 13:13:37
如下代码,按照我自己的理解会把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()
查看完整描述

4 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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

查看完整回答
反对 回复 2018-07-17
?
慕神8447489

TA贡献1780条经验 获得超1个赞

协程的概念: 用户空间的线程, 可调度的线程, 非抢占式. 即用户空间非抢占式可调度线程.

但是协程不是线程, 不可并发, 不具有异步性.

即每次都会阻塞在yield处, 但也只是阻塞这一次当前调用, 只有当前调用完成后才会进行下次调用.

协程的好处, 个人理解, 是给于我们单线程内实现非线性程序实现.


查看完整回答
反对 回复 2018-07-17
  • 4 回答
  • 0 关注
  • 372 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信