진행 상황을 출력하고 에러를 처리하며 내려받기

매일 공부(ML)·2023년 5월 23일
0

Fluent Python

목록 보기
125/130

제어 흐름

asyncio를 이용한 동시성

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 되지 않고(즉, 일부 작업이 완료되지 않았으므로, 버그가 발생할 가능성이 높다.)

profile
성장을 도울 아카이빙 블로그

0개의 댓글