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 |
'Python > 개념' 카테고리의 다른 글
데이터베이스와 MongoDB 연결 (0) | 2024.06.03 |
---|---|
Day 11. 재귀호출 (0) | 2024.03.29 |
Day 9. 과제 _ 파일 입출력을 이용한 단어장 만들기 (0) | 2024.03.27 |
Day 10. 과제: 디렉토리 관련 프로그램 (0) | 2024.03.24 |
Day 10. 디렉토리 관리 프로그램 (0) | 2024.03.22 |