파이썬, 비동기 함수에서 동기 함수 호출하기
글. 수알치 오상문
다음 예제는 비동기 호출 함수에서 동기 호출을 하는 time.sleep()을 호출한다.
time.sleep() 기능을 비동기식으로 작성하려면 당연히 await asyncio.sleep()을 사용해야 하는데,
이번 예제는 동기 함수를 호출하는 예제이므로 time.sleep()을 예로 들어서 작성하였다.
# 비동기 함수에서 동기(blocking I/O) 함수 사용하기
import time
import asyncio
async def func(delay):
start = time.time()
# await asyncio.sleep(delay)
await loop.run_in_executor(None, time.sleep, delay) # (None, 함수, 인수1, 인수2, ...)
laptime = time.time() - start
return f'OK {delay}: {laptime}초'
async def main():
futures = [asyncio.ensure_future(func(i)) for i in range(2,7,2)]
results = await asyncio.gather(*futures)
print(results)
# TEST ---------------------------------
loop = asyncio.get_event_loop()
start = time.time()
loop.run_until_complete(main())
print("걸린 시간: %.3f초" %(time.time()-start))
loop.close()
[실행 결과] await loop.run_in_executor(None, time.sleep, delay)
['OK 2: 2.009756088256836초', 'OK 4: 4.007898330688477초', 'OK 6: 6.0067830085754395초']
걸린 시간: 6.049초
[실행 결과] await asyncio.sleep(delay)
['OK 2: 2.002323627471924초', 'OK 4: 3.994692325592041초', 'OK 6: 6.0075905323028564초']
걸린 시간: 6.065초
'Python 기초' 카테고리의 다른 글
파이썬, asyncio 함수 실행 취소 및 예외 처리 (0) | 2022.07.31 |
---|---|
파이썬, 백그라운드 함수 실행 데코레이터 만들어 사용하기 (0) | 2022.07.31 |
파이썬, 데코레이터 패턴으로 함수 호출 전후 반복 행동 처리하기 (0) | 2022.07.31 |
AttributeError: module 'collections' has no attribute 'Callable' (0) | 2022.07.30 |
파이썬, 동기식, 비동기식(구형/신형) 함수 사용 비교 예제 2 (0) | 2022.07.30 |