[英]asyncio.TimeoutError is never raised
我想測試asyncio
如何處理阻塞進程。
我的代碼肯定有問題,因為永遠不會引發asyncio.TimeoutError
:
import asyncio, random, time
q = asyncio.Queue()
MAX_WAIT = 5
@asyncio.coroutine
def blocking_task(sec):
print('This task will sleep {} sec.'.format(sec))
time.sleep(sec)
@asyncio.coroutine
def produce():
while True:
q.put_nowait(random.randint(1,10))
yield from asyncio.sleep(0.5 + random.random())
@asyncio.coroutine
def consume():
while True:
value = yield from q.get()
try:
yield from asyncio.wait_for(blocking_task(value), MAX_WAIT)
except asyncio.TimeoutError:
print('~/~ Job has been canceled !!')
else:
print('=/= Job has been done :]')
loop = asyncio.get_event_loop()
asyncio.ensure_future(produce())
asyncio.ensure_future(consume())
loop.run_forever()
此代碼產生以下輸出:
$ ./tst3.py
This task will sleep 2 sec.
=/= Job has been done :]
This task will sleep 1 sec.
=/= Job has been done :]
This task will sleep 7 sec.
=/= Job has been done :]
使用
asyncio.sleep
而不是sleep
asyncio的TimeoutError與buildin TimeoutError不同。 這就是為什么您不能使用time.sleep觸發此錯誤的原因。 要在asyncio.coroutine中觸發TimeoutError,您只能使用由asyncio模塊實現的計時器。
@asyncio.coroutine
def blocking_task(sec):
print('This task will sleep {} sec.'.format(sec))
yield from asyncio.sleep(sec)
結果
This task will sleep 10 sec.
~/~ Job has been canceled !!
This task will sleep 3 sec.
=/= Job has been done :]
This task will sleep 4 sec.
=/= Job has been done :]
This task will sleep 2 sec.
=/= Job has been done :]
This task will sleep 7 sec.
~/~ Job has been canceled !!
This task will sleep 2 sec.
=/= Job has been done :]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.