About me
home
Portfolio
home

Asynchronous 실습

날짜
2023/07/19
태그
파이썬

asyncio 사용 방법

asyncio는 파이썬 비동기 I/O 프레임워크이다.
async def로 비동기 함수 선언하기: 비동기 함수를 만들려면 함수 앞에 async 키워드를 붙여주면 된다.
async def my_function(): pass
Python
복사
await로 비동기 함수 호출하기: 비동기 함수는 await 키워드를 이용하여 호출한다. await 키워드는 해당 비동기 함수의 작업이 완료될 때까지 기다리라는 의미이다.
await my_function()
Python
복사
asyncio.run()으로 비동기 프로그램 시작하기: 비동기 함수를 바로 실행할 수 없다. 대신, 비동기 함수를 asyncio.run()의 인자로 넘겨주어야 한다.
asyncio.run(my_function())
Python
복사
asyncio.sleep()으로 비동기 적으로 대기하기: time.sleep() 대신 asyncio.sleep()을 사용하면, 해당 시간 동안 다른 작업을 수행할 수 있다.
await asyncio.sleep(1)
Python
복사
asyncio.create_task()로 비동기 작업 생성하기: 동시에 여러 비동기 함수를 실행하려면 이 함수를 사용한다. 이 함수는 인자로 주어진 코루틴을 실행하기 위한 Task 객체를 반환한다. 이렇게 생성된 Task는 자동으로 스케줄링되어 실행된다.
task = asyncio.create_task(my_function())
Python
복사
asyncio.gather()로 여러 비동기 작업을 동시에 시작하기: 이 함수를 사용하면 여러 개의 코루틴을 동시에 시작할 수 있다.
await asyncio.gather(my_function(), my_other_function())
Python
복사

Asyncio 모듈을 이용한 비동기 프로그래밍

# Asyncio 모듈을 이용한 비동기 프로그래밍 import time import asyncio # 비동기 함수 async def exe_calculate_async(name, n): for i in range(1, n + 1): print(f'{name} -> {i} of {n} is calculating..') await asyncio.sleep(1) print(f'## {name} - {n} working done!') # 비동기 프로세스 async def process_async(): start = time.time() await asyncio.wait([ exe_calculate_async('One', 3), exe_calculate_async('Two', 2), exe_calculate_async('Three', 1), ]) end = time.time() print(f'>>> total seconds : {end - start}') # 비교를 위한 동기 함수 def exe_calculate_sync(name, n): for i in range(1, n + 1): print(f'{name} -> {i} of {n} is calculating..') time.sleep(1) print(f'## {name} - {n} working done!') # 비교를 위한 동기 프로세스 def process_sync(): start = time.time() exe_calculate_sync('One', 3) exe_calculate_sync('Two', 2) exe_calculate_sync('Three', 1) end = time.time() print(f'>>> total seconds : {end - start}') if __name__ == '__main__': # Sync 실행 # process_sync() # Async 실행 asyncio.run(process_async())
Python
복사
Asyncio 비동기.py
1.2KB
Sync(동기) 실행 결과
Async(비동기) 실행 결과
이 코드는 비동기 프로그래밍동기 프로그래밍의 실행 속도 차이를 보여준다. 비동기와 동기 방식 모두에서 같은 작업을 수행하고, 수행에 걸린 시간을 출력한다.
1.
exe_calculate_async(name, n) 함수는 비동기 함수로, 입력받은 n번 동안 name을 출력하고, 각 반복마다 1초 동안 일시 중지한다.
2.
process_async() 함수는 asyncio.wait()를 사용하여 3개의 exe_calculate_async() 함수를 동시에 실행한다. 이 함수들은 'One', 'Two', 'Three'라는 이름을 가지며, 각각 3회, 2회, 1회를 반복한다. 이 모든 작업을 마친 후에 걸린 시간을 출력한다.
3.
exe_calculate_sync(name, n) 함수는 동기 함수로, 비동기 함수와 동일한 작업을 수행하지만, 각 반복마다 1초 동안 프로그램 전체가 일시 중지된다.
4.
process_sync() 함수는 동기 함수들을 연속적으로 실행한다. 비동기 함수와 마찬가지로, 이 함수들은 'One', 'Two', 'Three'라는 이름을 가지며, 각각 3회, 2회, 1회를 반복한다. 모든 작업을 마친 후에 걸린 시간을 출력한다.
5.
프로그램은 동기 작업을 실행하는 부분이 주석 처리되어 있어, 비동기 작업만 실행된다.
이 프로그램을 실행하면 동기 함수(6.04s)보다 비동기 함수(3.02s)더 빨리 완료되는 것을 확인할 수 있다. 이는 비동기 함수가 일시 중지되는 동안 다른 함수가 실행될 수 있기 때문이다.