2
나는 파이썬 asyncio
으로 놀고있다. 내 프로그램에는 3 개의 코 루틴 만 있습니다. 그들 중 2 명은 직접 일정을 계획하고 3 명은 포스터 중 한 명으로부터 계획을 세웁니다. 실제로 가이 취소되었습니다 coro2
이 취소되지 않은 이유왜 부모의 coroutine이 취소되지 않았습니까?
coro1
coro2
coro3
^CExiting... Cancelling all tasks
Cancellation is done!
coro3 exc CancelledError()
coro1 exc CancelledError()
Task was destroyed but it is pending!
task: <Task pending coro=<coro2() running at test.py:15> wait_for=<Task cancelled coro=<coro3() done, defined at test.py:23>>>
그래서 궁금하고, coro3
:
import asyncio
async def coro1():
try:
print('coro1')
await asyncio.sleep(1000)
except Exception as e:
print('coro1 exc %s' % repr(e))
raise
async def coro2():
try:
print('coro2')
await asyncio.ensure_future(coro3())
await asyncio.sleep(1000)
except Exception as e:
print('coro2 exc %s' % repr(e))
raise
async def coro3():
try:
print('coro3')
await asyncio.sleep(1000)
except Exception as e:
print('coro3 exc %s' % repr(e))
raise
loop = asyncio.get_event_loop()
try:
f1 = asyncio.ensure_future(coro1())
f2 = asyncio.ensure_future(coro2())
loop.run_forever()
except KeyboardInterrupt:
print('Exiting... Cancelling all tasks')
f2.cancel()
f1.cancel()
# This code gives the same result:
# for task in asyncio.tasks.Task.all_tasks(loop):
# task.cancel()
print('Cancellation is done!')
loop.stop()
loop.run_forever()
finally:
loop.close()
이 코드는 다음 출력을 생성 : 그리고 사용자가 Ctrl+C
가 누를 때 제대로 내 프로그램을 마무리 할 ?
코 루틴 2는 코 루틴 3이 반환 된 후 추가로 1000 초 동안 휴면합니다. 수면 시간을 줄이거 나 (또는 1000 초를 기다려보십시오!) – shongololo
@ shongololo, 나는 'a sleep sleep (1000)'을 전혀 삭제하지 않더라도 관찰 된 행동은 변하지 않을까 걱정됩니다. –
아, 스크롤 막대에 숨겨진 코드 샘플의 가장 낮은 줄을 보지 못했습니다. 코 루틴 2가 예외를 반환 할 기회를 얻지 못하고 루프가 닫힐 때까지 종료 될 수 있습니다. 루프를 닫기 전에 모든 작업이 취소되었는지 확인할 때까지 기다릴 수는 있지만 예외가 표시되지는 않습니다. – shongololo