본문 바로가기
Python/개념

파이썬 비동기

by 사라리24 2024. 6. 3.
SMALL

1. 동기(Synchronous)

- 작업이 순차적으로 실행되는 것
- 하나의 작업이 끝나기 전에는 다음 작업을 시작하지 않음

 

  • 동기 원리
  
 
          def func1():
              print('1')
              print('2')
              print('3')

          def main():
              func1()
 
          main()
  
  
1
2
3

 

 

  • 시간차를 두었을 때 
 
 
 
        # main 함수는 smile 함수가 종료될 때까지 기다림
        # smile 함수가 종료되기 전에 main 함수에서 더 처리해야 할 일이 있다면? --> 비동기

        import time
 
 
        def smile():
            time.sleep(1)
            print('😊😊😊😊😊')

        def main():
            smile()
            smile()
 
 
       main()
 
  
😊😊😊😊😊 
(1초뒤에) 
😊😊😊😊😊

 

  • 시간 찍어보기
 
 
 
          print(f"시작:{time.strftime('%X')}")
          main()
          print(f"끝:{time.strftime('%X')}")
 
  
시작:02:12:08
😊😊😊😊😊
😊😊😊😊😊
끝:02:12:10

 

 

2. 비동기(Asynchronous) 

- 작업이 병렬적으로 실행되는 것
- 시간이 오래 걸리는 작업을 기다리는 동안 다른 작업을 수행

 

  • asyncio 설치

 
        import asyncio
 
 

 

 

  • 비동기 함수: 오류
 
      

 
          async def smile():
            await asyncio.sleep(1)
            print('😊😊😊😊😊')

          async def main():
            # 여러 비동기 작업을 동시에 실행하고 그 결과를 반환하는데 사용
            await asyncio.gather(
                smile(),
                smile()
            )
 
 
 
      asyncio.run(main())  # 오류가 남
 
 

 

  • 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()
          )
 
        asyncio.run(main())
 
 
😊😊😊😊😊
😊😊😊😊😊

오류 없이 실행 됨

 

 

  • 시간 찍어보기
 
 
          print(f"시작: {time.strftime('%X')}")
          asyncio.run(main())
          print(f"끝: {time.strftime('%X')}")  # 1초 차이
 
  
시작: 02:14:54
😊😊😊😊😊
😊😊😊😊😊
끝: 02:14:55