asyncio는 이벤트 루프에 의해 운용되는 코루틴을 이용해서 동시성을 구현하는 패키지이다.
스레드 및 GIL에 대해 설명하면서 미셜 시미오나토는 장시간 연산이 실행되는 동안 multiprocessing 패키지를 이용해서 콘솔에 아스키 문자로 스피너 애니메이션을 보여준다.
#코루틴으로 넥스트 스피너 애니메이트하기
import asyncio
import itertools
import sys
@asyncio.coroutine
def spin(msg):
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\\'):
status = char + ' ' + msg
write(status)
flush()
write('\x088' * len(status))
try:
yield from asyncio.sleep(.1)
except asyncio.CancelledError:
break
write(' ' * len(status) + '\x088' * len(Status)
@asyncio.coroutine
def slow_function():
#입출력을 위해 장시간 기다리는 것처럼 보이게 만든다.
yield from asyncio.sleep(3)
return 42
@asyncio.coroutine
def supervisor():
spinner = asyncio.async(spin('thinking!'))
print('spinner object:',spiner)
result = yield from slow_function()
spinner.cancel()
return result
def main():
loop = asyncio.get_event_loop()
result = loop.run_until_complete(supervisor())
loop.close()
print('Answer:', result)
if __name__ = '__main__':
main()
반드시 @asyncio.coroutine 데커레이터를 사용해야 하는 것은 아니지만. 되도록이면 사용 하라고 강력히 권고한다. @asyncio.coroutine은 코루틴을 일반 함수와 다르게 보이도록 만 들며, 코루틴이 yield from 되지 않고(즉, 일부 작업이 완료되지 않았으므로, 버그가 발생할 가능성이 높다.)