asyncio 모델에서 실행은 이벤트 루프에 의해 스케줄되고 조정됩니다. 현재 일시 중지 된 작업의 실행을 취소하려면 기본적으로 에을 다시 시작해야합니다. 이것이 실제로는 조금씩 다르지만 이론적으로 일시 중지 된 작업을 취소하는 것이 분명해야합니다.
개별 시간 초과는 동일한 방식으로 가능합니다. 결과를 기다리도록 코 루틴을 일시 중단 할 때마다 시간 초과 값을 제공하려고합니다. 이벤트 루프는 대기 시간이 초과되고 작업이 아직 완료되지 않은 경우 대기중인 작업을 취소합니다.
일부 콘크리트 샘플 :이 방법은 잠
class Foo:
task = None
async def sleeper(self):
self.task = asyncio.sleep(60)
try:
await self.task
except concurrent.futures.CancelledError:
raise NotImplementedError
동안, 다른 사람이 코 루틴을 깨워 foo.task.cancel()
를 호출 할 수 있습니다 : 실제로
>>> import asyncio
>>> loop = asyncio.get_event_loop()
>>> task = asyncio.ensure_future(asyncio.sleep(5))
>>> task.cancel()
>>> loop.run_until_complete(task)
Traceback (most recent call last):
...
concurrent.futures._base.CancelledError
이 이런 식으로 뭔가를 사용하여 구현 될 수있다 취소를 처리하게하십시오. 또는 sleeper()
으로 전화하면 을 직접 삭제할 수 있습니다.
이
async def fetch_page(session, url):
with aiohttp.Timeout(10):
async with session.get(url) as response:
assert response.status == 200
return await response.read()
with aiohttp.ClientSession(loop=loop) as session:
content = loop.run_until_complete(fetch_page(session, 'http://python.org'))
은 분명히 fetch_page
호출 할 때마다 자신의 aiohttp.Timeout
값을 결정할 수 있으며, : 특히 HTTP 요청 시간 초과의 맥락에서
>>> loop.run_until_complete(asyncio.wait_for(asyncio.sleep(60), 5))
[ ... 5 seconds later ... ]
Traceback (most recent call last):
...
concurrent.futures._base.TimeoutError
이
aiohttp를 참조하십시오
유사 쉬운 시간 초과되어 설정 각 개별 인스턴스는 해당 시간 초과에 도달하면 자체 예외를 throw합니다.
자체 봉쇄를 위해 여기에 다른 두 가지 질문을 요약 할 수 있습니까? – deceze
@deceze, 질문을 업데이트하고 내 결론을 추가했습니다. 이게 괜찮은가요, 아니면 아직도 뭔가 빠졌습니까? – guettli
감사합니다. 감사합니다. – deceze