你的理解完全錯誤: 1. timeout2秒不是2秒后才有回應(yīng),而是超過2秒后沒有回應(yīng)就會有異常, 你2秒后再回來檢查??
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)潁上免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
2. 用協(xié)程可以寫出異步IO的代碼,一秒1000的并發(fā)都沒問題,你根本就沒理解什么是協(xié)程
另外,樓上的回答用多線程或多進程可以做,, 我建議使用多線程完成,,,,,多進程消耗資源太多,而且IO密集型的程序,不需要用到多CPU
協(xié)程函數(shù):async def?函數(shù)名。3.5+
協(xié)程對象:執(zhí)行協(xié)程函數(shù)()得到的協(xié)程對象。
3.5之后的寫法:
3.7之后的寫法:更簡便
await后面?跟?可等待的對象。(協(xié)程對象,F(xiàn)uture,Task對象?約等于IO等待)
await實例2:串行執(zhí)行。 一個協(xié)程函數(shù)里面可以支持多個await ,雖然會串行,但是如果有其他協(xié)程函數(shù),任務(wù)列表也在執(zhí)行,依然會切換。只是案例中的main對應(yīng)執(zhí)行的others1和others2串行 。 await會等待對象的值得到之后才繼續(xù)往下走。
在前面的例子里學(xué)習(xí)了并發(fā)地執(zhí)行多個協(xié)程來下載圖片,也許其中一個協(xié)程永遠下載不了,一直阻塞,這時怎么辦呢?
碰到這種需求時不要驚慌,可以使用wait()里的timeout參數(shù)來設(shè)置等待時間,也就是從這個函數(shù)開始運行算起,如果時間到達協(xié)程沒有執(zhí)行完成,就可以不再等它們了,直接從wait()函數(shù)里返回,返回之后就可以判斷那些沒有執(zhí)行成功的,可以把這些協(xié)程取消掉。例子如下:
[python]?view plain?copy
import?asyncio
async?def?phase(i):
print('in?phase?{}'.format(i))
try:
await?asyncio.sleep(0.1?*?i)
except?asyncio.CancelledError:
print('phase?{}?canceled'.format(i))
raise
else:
print('done?with?phase?{}'.format(i))
return?'phase?{}?result'.format(i)
async?def?main(num_phases):
print('starting?main')
phases?=?[
phase(i)
for?i?in?range(num_phases)
]
print('waiting?0.1?for?phases?to?complete')
completed,?pending?=?await?asyncio.wait(phases,?timeout=0.1)
print('{}?completed?and?{}?pending'.format(
len(completed),?len(pending),
))
#?Cancel?remaining?tasks?so?they?do?not?generate?errors
#?as?we?exit?without?finishing?them.
if?pending:
print('canceling?tasks')
for?t?in?pending:
t.cancel()
print('exiting?main')
event_loop?=?asyncio.get_event_loop()
try:
event_loop.run_until_complete(main(3))
finally:
event_loop.close()
結(jié)果輸出如下:
starting main
waiting 0.1 for phases to complete
in phase 0
in phase 2
in phase 1
done with phase 0
1 completed and 2 pending
canceling tasks
exiting main
phase 1 canceled
phase 2 canceled