5

나는이 concurrent.futures 두 가지 문제 :는 asyncio하는

어떻게 파이썬 concurrent.futures에서 time.sleep()을 깰?

결론 : time.sleep()을 인터럽트 할 수 없습니다. 한 가지 솔루션은 다음과 같습니다. 주변에 루프를 작성하고 잠잘 수 있습니다.

는 concurrent.futures에 대한 How to break time.sleep() in a python concurrent.futures

개인 시간 제한을 참조하십시오?

결론 : 개별 시간 초과는 사용자가 구현해야합니다. 예 : 각 시간 초과에 대해 wait()을 호출 할 수 있습니다.

Individual timeouts for concurrent.futures

질문 asyncio 해결합니까

논문 문제를 참조하십시오?

+0

자체 봉쇄를 위해 여기에 다른 두 가지 질문을 요약 할 수 있습니까? – deceze

+0

@deceze, 질문을 업데이트하고 내 결론을 추가했습니다. 이게 괜찮은가요, 아니면 아직도 뭔가 빠졌습니까? – guettli

+0

감사합니다. 감사합니다. – deceze

답변

5

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합니다.

+0

와우, 훌륭한 대답. 고맙습니다. 내가 서브 프로세스 모듈을 사용한다고 가정 해 보겠습니다. 서브 프로세스 모듈을 어떻게 든 사용하고 싶습니다. 이 작업을 수행하는 방법에 대한 힌트가 있습니까? – guettli

+0

사실, 아니요.새로운 질문을 열어야합니다. – deceze

+2

@guettli [asyncio.subprocess] (https://docs.python.org/3/library/asyncio-subprocess.html) 모듈과 그 [예제] (http://asyncio.readthedocs.io)를 살펴보십시오. /en/latest/subprocess.html). – Vincent