| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- ngrok
- TensorFlow
- 특정값지우기
- AI #RNN #LSTM #LSTMP #인공지능 #언어학습 #순차학습
- pandas #python #excel #판다스 #파이썬 #엑셀저장 #xlsxwriter
- mnist
- 판다스 #Pandas #DataFrame #Statistics #통계 #파이썬 #Python #Resample
- 깃허브
- pandas #ewma #python #지수이동가중평균 #파이썬 #판다스 #ema #ewm
- aiohttp
- REST_API
- AI #Inductive_Bias #Relational_inductive_bias
- 시계열데이터
- Python
- 파이썬
- SQL #PostgreSQL
- MachineLearning
- 비동기모듈
- 선형회귀
- Github
- tensorflow #tensorflow-gpu #python #ubuntu #텐서플로우
- python #pandas #data_preprocessing #data_process
- version_error
- SQL #python #MySQL #PostgreSQL
- Asyncio
- git
- 깃
- fashionmnist
- pandas #python #date #datetime
- tf.where
- Today
- Total
린스토리
[Asyncio] 동기와 비동기 차이점 및 Asyncio란? 본문
API로 DL 모델을 실행하면서 동시에 다수의 모델을 train 시키고 싶었다.
이 과정에서 asyncio 라이브러리를 접하게 되었고, 이 라이브러리에 대해 개념을 설명하고자 한다.
동기와 비동기
"동기(Synchronous)"란 동시에 일어난다, 라는 뜻을 가지고 있다.
즉, 요청과 그 결과가 동시에 일어난다는 뜻이다. 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 한다.
"비동기(Asynchronous)"란 동시에 일어나지 않는다, 라는 뜻을 가지고 있다.
즉, 요청과 그 결과가 동시에 일어나지 않을 것이라는 뜻이다.
이 둘은 상황에 따라 장단점이 있다.
동기 방식은 설계가 간단하고 직관적이지만 결과가 주어질 때까지 다른 작업을 하지 못하고 대기해야 한다는 단점이 있다.
비동기 방식은 동기 방식보다 복잡하지만 결과가 주어지는 데 시간이 걸릴 동안 다른 작업을 할 수 있어 효율적인 자원 활용을 할 수 있다는 장점이 있다.
정리하자면,
- 동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 목적의 차이다.
- 동기는 추구하는 행위와 목적이 동시에 이루어진다.
- 비동기는 추구하는 행위와 목적이 다를 수도 있고, 동시에 이루어지지 않는다.
블록과 논블럭
블록과 논블럭은 동기, 비동기와 연결되는 개념이다.
"블록"이란 동기의 개념에서 만들어진 상태로,
요청 후 결과가 나올 때까지 계속 대기해야 하는 상태를 블록 상태라고 한다.
"논블럭"이란 비동기의 개념에서 만들어진 상태로,
요청 후 결과가 나올 때까지 시간을 대기하지 않고 제약없이 자유롭게 다른 작업을 할 수 있는 상황을 논블럭 상태라고 한다.
Asyncio of Python
파이썬은 동기 방식으로 동작하도록 설계된 언어이다. 파이썬을 자바스크립트처럼 비동기 방식으로 프로그래밍 할 수 있도록 도와주는 라이브러리가 Asyncio이다.
코드를 짜다보면 Multi Thread로 구현하게 되는 일이 생긴다. 하지만 꼭 Multi Thread가 Single Thread보다 성능이 좋은 것은 아니다. 또한 Thread Safe한 프로그램을 작성하는 것은 생각보다 쉬운 일이 아니다.
이러한 이유로 최근에는 하나의 Thread로 동시 처리를 하는 비동기 프로그래밍이 주목을 받고 있다.
python 3.4부터 asyncio가 표준 라이브러리로 추가되고, python 3.5부터 async/await 키워드가 문법으로 채택되면서 언어 자체적으로 비동기 프로그래밍이 가능해졌다.
=== Asyncio 모듈 설치
pip install asyncio
conda install -c mutirri asyncio
python의 def 키워드로 선언하는 모든 함수는 기본적으로 동기 방식으로 동작한다.
예를 들면, 다음과 같은 함수는 동기 함수이다.
def try_sync():
pass
위 함수의 def 키워드 앞에 async 키워드를 붙이면 비동기 처리가 되며, 이런 비동기 함수를 파이썬에서는 코루틴(coroutine)이라고도 한다.
async def try_sync():
pass

위와 같이 설계된 비동기 함수는 일반적으로 async로 선언된 다른 비동기 함수 내에서 await 키워드를 붙여서 호출해야 한다.
async def main():
await try_sync()
async로 선언되지 않은 일반 동기 함수 내에서 비동기 함수를 호출하려면 asyncio 라이브러리의 이벤트 루프를 이용해야 한다.
import asyncio
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
# if python.__version__ >= 3.7
asyncio.run(main())
Asyncio Test
Synchronized
다음과 같은 동기 함수를 실행시킨다고 해보자.
import time
def print_things(sentence, n):
for i in range(n):
print("Requested_sentence: ", sentence)
time.sleep(1)
print("Completed for: ", sentence)
def process_sync():
start = time.time()
print_things("333", 3)
print_things("222", 2)
print_things("111", 1)
end = time.time()
print("처리시간: ", end-start)
if __name__ == '__main__':
process_sync()
이렇게 실행시키면 다음과 같은 결과가 나온다.

Asynchronized
위 함수를 비동기 함수로 실행시켜보자.
import time
import asyncio
async def print_things(sentence, n):
for i in range(n):
print("Requested_sentence: ", sentence)
await asyncio.sleep(1)
print("Completed for: ", sentence)
def 함수를 async로 비동기 처리 해주고, time.sleep() 대신 asyncio.sleep()을 해주면 CPU가 놀지 않고 다른 처리를 할 수 있도록 해준다. 여기서 asyncio.sleep() 자체도 비동기 함수이기 때문에 await 키워드를 앞에 써주어야 한다.
async def process_async():
start = time.time()
await asyncio.wait([print_things("333", 3),
print_things("222", 2),
print_things("111", 1)],)
end = time.time()
print("처리시간: ", end-start)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(process_async())
loop.close()
asyncio.wait()를 통해 coroutine 객체를 넘겨주도록 한다. 이렇게 넘겨주면 알아서 3개의 함수를 호출해 스케쥴하여 비동기로 호출할 수 있도록 한다.
이렇게 하면 결과는 다음과 같이 나온다.

순차적으로 앞선 결과가 끝나길 기다리지 않고 다른 작업을 수행함으로써 처리 시간이 절반으로 줄어든 것을 확인할 수 있다. 물론 비동기 처리를 하게 되면 작업 순서는 동기 처리보다 뒤죽박죽이 된다.
때에 맞춰서 적용하는 것이 필요하다!!
은행의 송금과 같이 수신인과 송신인 간의 관계가 매칭되어야 하는 작업에는 옳지 않음을 알 수 있다.
무엇이든 상황에 맞춰 활용하는 것이 중요하다.
이렇게 동기와 비동기를 알아보았다.
이제.. 이 개념을 적용해 Multi-DL-training을 구현해 보아야겠다.
'Python > API' 카테고리의 다른 글
| [이론] RestAPI와 Websocket (0) | 2022.08.12 |
|---|---|
| [Python 3.X aiohttp error] "aiohttp.client_exceptions.ServerDisconnectedError: Server disconnected" 해결 (0) | 2022.08.11 |
| [Flask & Ngrok] 포트포워딩 없이 외부에서 로컬 서버로 접속하기 (0) | 2022.08.04 |