asyncio는 비동기 프로그래밍을 위한 라이브러리. 모든 것을 정리하자니 귀찮아서 샘플 코드 하나로 끝낸다.
asyncio.ensure_future
loop
에 schedule한다.coroutine
을 future
로 감싸서 return한다.queue.put
& queue.get
asyncio.get_event_loop
loop.add_reader(fd, callback)
loop.run_until_complete(task or future)
future.add_done_callback(_run_until_complete_cb)
를 호출하며,_run_until_complete_cb
는 future._loop.stop()
을 호출한다.loop.remove_reader(fd)
import asyncio
import sys
from functools import partial
def handle_stdin(queue):
data = sys.stdin.readline().strip()
if data == 'q':
loop = asyncio.get_event_loop()
loop.remove_reader(sys.stdin)
asyncio.ensure_future(queue.put(data))
async def tick(queue):
stop = False
while not stop:
data = await queue.get()
print('Data received: {}'.format(data))
if data == 'q':
stop = True
print("tick finished.")
def main():
queue = asyncio.Queue()
loop = asyncio.get_event_loop()
loop.add_reader(sys.stdin, partial(handle_stdin, queue))
loop.run_until_complete(tick(queue))
loop.close()
if __name__ == '__main__':
main()`
asyncio
: 비동기 프로그래밍과 관련된 함수와 클래스를 포함합니다.
sys
: 시스템 특정 파라미터와 함수에 접근할 수 있도록 합니다.
partial
: 함수를 부분적으로 호출할 수 있게 해줍니다.
handle_stdin
함수:
tick
함수:
main
함수:
loop.add_reader
: 표준 입력에 데이터가 들어올 때마다 handle_stdin
함수를 호출합니다.loop.run_until_complete(tick(queue))
: tick
함수가 완료될 때까지 이벤트 루프를 실행합니다.if __name__ == '__main__':
:
main
함수를 호출합니다.**asyncio.Queue
**는 async/await
문법에 적합하게 설계되어 있어서 비동기 작업에서의 데이터 교환에 최적화되어 있습니다.