2017-11-06 5 views
0

에 asyncio 중지부터 시작 (결국 정지) 스레드 그래서 같은 asyncio 루프가 이것은 asyncio.CancelledError 제기 때문에 작동하지 않습니다 ... stop 방법의 어디서나 그들을 잡는 것은 도움이되지 않는 것 같습니다.스레드

@pytest.mark.asyncio으로 표시되지 않은 테스트 코드를 실행하면 Task was destroyed but it is pending!이라는 메시지가 나타납니다.

내가 뭘 잘못하고 있니?

+0

시도로 모든 비동기 발전기를 닫 기억 'isAlive'를 확인 하시겠습니까? – Sraw

+0

@Sraw 왜 도움이 될까요? 어쨌든, 나는 그것을 시도하고 그것은하지 않습니다. – Sardathrion

+1

왜냐하면'run'이 끝나기 전에'stop'을 호출하는 것이 원인 일 수 있다고 생각하기 때문입니다. 불행히도 그렇지 않습니다. – Sraw

답변

0

여기에 몇 가지 문제가 있습니다.

  1. Task.cancel()은 쿠로틴 내부에서 asyncio.CancelledError()를 발생시킵니다. 코 루틴에서 "try/exec CancelledError"를 추가하여 예외를 처리해야합니다.

  2. 는 또 다른 방법은 데프 정류장에서 CancelledError 예외를 억제 할 수있는 것은 :

    from asyncio import CancelledError 
    from contextlib import suppress 
    
    def stop(self): 
        self._logger.info("Thread has been asked to stop!") 
        if self.loop.is_running(): 
         self._logger.debug("Asked running asyncio loop to stop.") 
         self.loop.call_soon_threadsafe(self.loop.stop) 
         for task in asyncio.Task.all_tasks(): 
          task.cancel() 
          with suppress(CancelledError): 
           loop.run_until_complete(task) 
    
  3. 전에 몇 초를 기다려야

    loop.run_until_complete(loop.shutdown_asyncgens())