亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于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 關注
  • 409 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號