Python

Python 동기, 비동기

dustKim 2024. 6. 3. 22:23
동기(Synchronous)

 

- 작업이 순차적으로 실행되는 것이다.

- 하나의 작업이 끝나기 전에는 다음 작업을 시작하지 않는다.

더보기
# 동기 비동기를 확인하기 위해 time 모듈을 가져오기
import time
# main 함수는 smile 함수가 종료될 때까지 기다림
# smile 함수는 종료되기 전에 main 함수에서 더 처리해야 할 일이 있다면 ??? -> 비동기
def smile():
  time.sleep(1)
  print("😀😀😀😀😀😀😀")

def main():
  smile()
  smile()
결과

 

시작은 45초, 끝은 47초 smile() 메서드에서 time.sleep()을 1초로 주었기 때문에 2초가 걸린 것이고, 실행되는 부분에서는 순차적으로 진행되는 것을 알 수 있다.

 

 

비동기(Asynchronous)

 

- 작업이 병렬적으로 실행되는 것이다.

- 시간이 오래 걸리는 작업을 기다리는 동안 다른 작업을 수행한다.

 

  • RuntimeError: asyncio.run() cannot be called from a running event loop

- asyncio.run() 함수는 새로운 이벤트 루프를 생성하고 주어진 서브루틴(코루틴)을 실행하기 위해 사용한다.

- 코랩이나 주피터 노트북 환경에서는 이미 이벤트 루프가 내부적으로 실행중이기 때문에 asyncio.run()을 호출하면 에러가 발생한다.

- 따라서 아래 모듈을 import 하고 메서드를 호출해야 한다.

import asyncio

# 요놈들
import nest_asyncio
nest_asyncio.apply()
더보기
async def smile():
  await asyncio.sleep(1)
  print("😀😀😀😀😀😀😀")

async def main():
  # 여러 비동기 작업을 동시에 실행하고 그 결과를 반환하는데 사용
  await asyncio.gather(
      smile(),
      smile()
  )
  
  
print(f"시작: {time.strftime('%X')}")
asyncio.run(main())
print(f"끝: {time.strftime('%X')}")
결과

 

시작은 1초, 끝은 2초 동기 방식과는 다르게 2초가 걸리지 않고 1초가 걸렸다. 따라서 작업이 병렬적으로 진행된다는 것을 알 수 있다.

'Python' 카테고리의 다른 글

Python MongoDB 연결  (0) 2024.06.03
재귀 호출(recursive call)  (0) 2024.04.01
Python 파일 입출력 라이브러리  (0) 2024.03.25
Python 타입 어노테이션  (0) 2024.03.24
Python 모듈(Module)과 파일 입출력  (0) 2024.03.24