ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비동기 라이브러리 Asyncio
    PYTHON/Python 라이브러리 2024. 1. 5. 19:46

    동기 (Synchronous)와 비동기(Asynchronous)

    싱크러너스 / 에이싱크러너스

     

     

    동기 : 서버에 요청을 보냈을 때 응답이 돌아와야 다음 동작 수행 가능 

    즉, A작업이 모두 진행될 때까지 B작업은 대기해야 함 

     

    비동기 : 서버에 요청을 보냈을 때 응답 상태와 상관없이 다음 동작 수행 가능 

    A작업이 시작되면 동시에 B작업도 실행. A작업은 결과값이 나오는대로 출력

     


     

    Asyncio

    에이싱크아이오

    대규모 병행 작업을 위한 비동기 프로그래밍

    동시성 코드를 작성하는 라이브러리 !

    • 단일 프로그램에서 동시에 여러개의 HTTP 요청 병행하여 실행 가능 
    • 대기를 필욜 하는 여러개의 작업 동시 수행 가능 
    • 작업 A가 완료되길 기다리는 동안 작업 B 수행 가능

     

    Python에서는 Asyncio 모듈을 통해 '코루틴' 지원 

    여기서 코루틴이란? 프로그램 실행 중, 일시정지되었다가 필요한 시점에 다시 시작할 수 있는 루틴. 기존의 서브루틴과는 달리 코루틴은 실행을 중지한 지점에서 다시 실행 가능. 

    • 코루틴은 비동기 처리가 가능하고 여러 작업 병렬 실행 가능 
    • 코루틴은 실행 중인 위치를 기억하고 있다가, 중지된 지점에서 다시 실행 재개 가능 
    • 코루틴은 스레드보다 가볍고, 많은 수의 코루틴을 동시에 실행해 리소스를 효율적으로 사용가능
    • 비동기 로직을 구현할 때 콜백 패턴에 비해 읽기가 쉽고 이해하기 쉬운 코드 작성 가능 

     


     

    모르는 단어 
    스레드 (Thread)
    프로세스 내에서 실행 되는 흐름 단위. 각 스레드는 프로세스의 메모리를 공유하며 별도의 실행 경로를 가짐. 
    멀티스레딩을 사용하면 하나의 프로그램에서 여러 작업을 동시에 실행 가능 
    콜백 패턴
    A함수를 호출할 때, B함수(콜백 함수)를 인자로 전달하고 A의 처리가 끝난 후 B를 실행하는 프로그래밍 패턴.
    작업이 완료된 후, 수행할 행동을 정의할 때 유용.
    예를 들어, 네트워크 요청을 보낸 후 서버로부터 응답이 돌아올 때 실행할 작업을 콜백으로 정의
    리소스 (Resourse)
    프로그래밍에서 사용되는 모든 종류의 시스템 자원을 의미함. (CPU 시간, 메모리, 네트워크 대역폭, 파일 시스템 공간)
    프로그램에서 리소스는 데이터 저장, 작업 수행에 필요하고 DB연결이나 파일 핸들에도 리소스가 포함
    리소스 관리는 프로그램의 성능과 안정성을 유지하기 위해 중요. 불필요한 리소스 사용을 줄이고 사용이 끝난 리소스 해제 필요.
    네트워크 대역폭 (Network Bandwidth)
    일정 시간동안 네트워크를 통해 전송될 수 있는 최대 데이터 양 
    보통 초당 비트수로 측정. 
    대역폭이 높을 수록 더 많은 데이터를 빠르게 전송. 
    인터넷 연결, LAN 연결등 네트워크의 다양한 환경에서 중요한 요소.
    웹사이트 접속 속도, 파일 다운로드 속도, 스트리밍 품질 등에 영향을 줌. 
    파일 핸들 (File Handle)
    운영체제가 파일을 조작하기 위해 사용하는 참조나 포인터. 
    파일 핸들을 사용해 파일 읽기, 쓰기, 닫기등의 수행 -> 파일 시스템에 접근하지 않고 파일 작업 가능 
    파일 작업이 완료되면 핸들을 닫아 리소스를 해제 해야함. 
    서브루틴 (Subroutine)
    특정 작업을 수행하는 코드의 집합으로, 함수, 메소드등이 해당. 
    코드를 재사용할 수 있고 복잡한 프로그램을 관리하기 쉬운 작은 단위 
    서브루틴은 호출되면 작업을 수행하고 완료 후 호출한 곳으로 결과를 반환

     


     

    서브루틴과 코루틴의 차이

    서브루틴 코루틴
    함수, 메소드등으로 불리며 재사용이 가능한 코드 블록  
    코드를 작은 단위로 나누어 프로그램 관리가 쉬움   
    동일한 작업을 수행하는 코드를 여러번 작성하지 않고 재사용 가능 코드의 흐름이 복잡해질 수 있고, 일부 프로그래밍 언어에서는 코루틴을 지원하지 않음
    호출마다 시작부분부터 실행되고, 중간에 일시정지 불가. 중간부터 시작 불가. 실행 중 상태 유지를 못하고 매번 호출 시 초기 상태에서 시작.  실행 중 어느 시점에서든 중지되었다가 나중에 그 지점부터 다시 시작 가능. 실행 중 상태를 유지하고 중단된 지점에서 이후에 실행 재개 가능. 비동기 작업을 간결하게 구현 가능.

     

     

    import asyncio
    
    async def add(a, b): # 네이티브 코루틴
        print('add: {0} + {1}'.format(a, b))
        await asyncio.sleep(1,0) # 1초 대기, asyncio.sleep도 네이티브 코루틴
        return a + b
    
    async def print_add(a, b):
        result = await add(a, b)
    # await로 다른 네이티브 코루틴을 실행하고 반환값을 변수에 저장
        print('print_add: {0} + {1} = {2}'.format(a,b,result)) 
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(print_add(1,2))
    loop.close()
    1. print_add()에서 await 로 add() 실행 후 반환값을 변수에 저장 
    2. 코루틴 안에서 다른 코루틴을 실행할 때는 await를 사용
    3. add()에서 await asyncio.sleep(1.0)로 1초 대기한 뒤 return a + b로 두 수를 더한 결과를 반환
    4. asyncio.sleep도 네이티브 코루틴이라 await를 사용해야 함.

    'PYTHON > Python 라이브러리' 카테고리의 다른 글

    회사의 매출을 세련된 차트로 만들고 싶다면?  (0) 2024.03.16
    Tkinter 사용법  (0) 2024.01.02
Designed by Tistory.