파이썬, 비동기 함수에서 동기 함수 호출하기

 

글. 수알치 오상문

 

다음 예제는 비동기 호출 함수에서 동기 호출을 하는 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초

 

반응형

+ Recent posts