본문 바로가기
Python

[Python : Asyncio] 비동기로 프로그램(.py) 동시에 실행하기

by hyelllllog 2023. 5. 6.

현재 타 은행과 외환 거래 엔진 개발을 진행하고 있다.

우리는 딥러닝과 거래 조건 알고리즘을 통해 외환 거래에 필요한 시그널을 만들고,

시그널 요청 시, 소켓을 통해 실시간 시그널을 전송해야한다.

 

따라서 우리는 실시간으로 환율과 주문 내역을 받아올 부분,

데이터 요청을 확인하고 시그널을 전송하는 부분이 함께 작동되고 있어야한다.

 

팀장님의 도움 없이 개발해내야하는데,

경험이 없어서 개념을 이해하고 적용하는데 어려움이 좀 있다.

공부한 내용을 정리하고 미래의 내가 참고할 수 있도록 이 게시글을 쓴다.


처음 자료 조사를 위해 "멀티 프로레싱"를 키워드로 설정했었다.

조사를 해보니, 내가 알고 있던 멀티 프로세싱의 개념이 잘못 되었다는 것을 알았다.

멀티 프로세싱은 여러 개의 프로세서(ex. CPU)로 프로그램을 실행함으로써 프로그램 실행 속도를 높이는 것이다.

나는 프로세서의 사용량을 높이는 것이 목적이 아니라, 프로그램이 동시에 돌아갈 수 있도록 시스템을 구축해야했다.

나에게 필요했던 자료는 <멀티쓰레딩, 멀티태스크> 등의 내용이었다.

 

동시 프로그래밍의 패러다임의 변화

기존의 동시 프로그래밍(concurrent programming)은 여러 개의 쓰레드를 활용하여 이루어졌다.

하지만 thread safe한 프로그램을 만드는 것이 어려운 일이라고 한다.

또한 싱글 코어 프로세서에서 멀테 쓰레딩을 구현하게 되면,

동시 처리에 따른 성능 향상이 미미하거나 성능이 저하될 수 있다.

 

다양한 이유로 하나의 쓰레드로 동시 처리를 하는 비동기 프로그래밍(Asynchronous programming)이 주목받고 있다.

 

비동기 프로그래밍

[ 개념 ]

다양한 CPU 연산 처리를 위한 시간 대비 DB나 API 연동 과정에서 발생하는 대기 시간이 훨씬 길다.

비동기 프로그래밍은 이러한 대기 시간을 기다리면서 낭비하는 것이 아니라, 다른 처리를 할 수 있도록 한다.

따라서 프로그램 실행 시간을 줄일 수 있으며,

실시간으로 수행해야하는 작업이 다른 작업에 의해 딜레이 되지 않도록 돕는다.

 

찾아본 이미지 자료 중 가장 이해에 도움이 된 자료.

애초에 비동기 방식으로 설계된 언어인 자바스크립트와 달리, 파이썬은 동기 방식으로 설계되었기 때문에

비동기로 프로그램을 개발하려면 모듈이 필요하다.

'asyncio가 바로 그 모듈이며, 파이썬 3.4에서 표준 라이브러리로 추가되고, async/await가 문법으로 채택되었다

 

기본 구조

기존 함수 구조에 'async'를 붙이면 비동기로 처리된다.

이러한 비동기 함수를 '코루틴(coroutine)'이라 부른다.

async def async_func():
   print("sample")

 

이러한 비동기함수를 일반 함수처럼 호출하면, 함수가 실행되는 것이 아니라 코루틴 객체가 반환된다.

비동기함수를 실행하기 위해서는 async로 선언된 다른 비동기함수 내에서 await를 붙여 호출해야한다.

 

async def main_async():
   await async_func()

 

async로 선언되지 않은 일반 동기 함수 내에서 비동기 함수를 호출하려면,

asyncio 라이브러리의 이벤트 루프를 사용해야한다.

loop = asyncio.get_event_loop()
loop.run_until_complete(main_async())
loop.close()

>> 파이썬 3.7 이상부터는 run 함수 사용 가능
asyncio.run(main_async())

 

실제로 내가 구현한 코드의 구조를 나타내면 아래와 같다.

async main():
    await min_process()
 
 if __name__ == '__main__':
 	asyncio.run(main())

'Python' 카테고리의 다른 글

나 보려고 정리하는 Anaconda3 가상환경 관리  (0) 2022.06.30