Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Collaborative filtering
- airflow 정리
- git 기본명령어
- 데이터분석
- Oracle 논리적 저장 구조
- 네트워크
- 오라클 데이터 처리방식
- 의사결정나무
- 데이터 분석
- 알고리즘
- 추천시스템
- 앙상블
- Linux
- git stash
- enq: FB - contention
- git init
- Python
- eda
- 통계분석
- BFS
- 랜덤포레스트
- Spark jdbc parallel read
- 배깅
- 리눅스 환경변수
- Decision Tree
- Spark 튜닝
- CF
- SQL
- Spark Data Read
- Oracle ASSM
Archives
- Today
- Total
[Alex] 데이터 장인의 블로그
[비동기 프로그래밍] async 함수 설명 본문
동기적 코드
아래 코드는 '짜여진' 순서대로 실행된다.
때문에 식사 완료가 되기 전 mealtime 시간동안 '블로킹'이 발생하게 되고,
이로써 최종 코드 delivery("C", 1) 구동시간까지 지연시간이 발생하게 된다.
import time
def delivery(name, mealtime):
print(f"{name}에게 배달 완료!")
time.sleep(mealtime)
print(f"{name} 식사 완료, {mealtime}시간 소요...")
print(f"{name} 그릇 수거 완료")
def main():
delivery("A", 1)
delivery("B", 1)
delivery("C", 1)
if __name__ == "__main__":
start = time.time()
print(main()) # None
end = time.time()
print(end - start)
비동기 코드
아래 코드는 짜여진 순서와 상관없이 구동하게 된다.
때문에 각각의 mealtime의 지연시간 동안 배달완료(I/O) 작업을 수행할 수 있으며 이로써 총 수행시간은 줄어드는 효과를 볼 수 있다.
import time
import asyncio
async def delivery(name, mealtime):
print(f"{name}에게 배달 완료!")
await asyncio.sleep(mealtime)
print(f"{name} 식사 완료, {mealtime}시간 소요...")
print(f"{name} 그릇 수거 완료")
return mealtime
async def main():
result = await asyncio.gather(
delivery("A", 1),
delivery("B", 2),
delivery("C", 3),
)
print(result)
if __name__ == "__main__":
start = time.time()
asyncio.run(main())
end = time.time()
print(end - start)
비동기 코드 내 동기적 실행
만약 비동기로 수행될 필요가 없는 작업이라면 어떨까? 혹은, 비동기 작업 내 강제로 동기적으로 수행되어야 하는 작업이 있다면 어떨까? async 로 작성된 비동기 함수를 '동기적'으로 실행하려면 다음과 같이 표현한다.
import time
import asyncio
async def delivery(name, mealtime):
print(f"{name}에게 배달 완료!")
await asyncio.sleep(mealtime)
print(f"{name} 식사 완료, {mealtime}시간 소요...")
print(f"{name} 그릇 수거 완료")
return mealtime
async def main():
await delivery("A", 1)
await delivery("B", 2)
await delivery("C", 3)
if __name__ == "__main__":
start = time.time()
asyncio.run(main())
end = time.time()
print(end - start)
그 밖에 async 함수 설명
# 코루틴 hello world!
# https://docs.python.org/ko/3/library/asyncio-task.html
import asyncio # python 스크립트에서 async 함수를 사용할 수 있게끔 도와주는 라이브러리
# awaitable 객체란?
# 코루틴, 태스크, 퓨처
# 코루틴 함수 -> async def hello_world():
# 코루틴 함수2 -> await asyncio.sleep(mealtime)
# 태스크 객체 : 미리 예약된 작업
# task1 = asyncio.create_task(hello_world())
# await task1
# 위 작업은 아래 작업과 동일하다.
# await hello_world()
async def hello_world():
print("hello world")
return 123
if __name__ == "__main__":
asyncio.run(hello_world()) # async로 작성된 함수를 실행하려면 다음과 같이 작성해야 한다.
반응형
'Python' 카테고리의 다른 글
[비동기 프로그래밍] Block, Async 기초 개념 (0) | 2022.11.29 |
---|---|
[Python] 데코레이터(Decorator) 사용하기 (0) | 2021.12.26 |
[Python] python 라이브러리 오프라인 설치 (feat.pip) (0) | 2021.12.22 |
[Python] - 암호화 라이브러리 hashlib (0) | 2021.01.05 |
[Python] - 파이썬, SQL 연동하기 (0) | 2020.06.14 |
Comments