ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 동기 작업과 비동기 작업
    Data Engineer 2023. 12. 3. 22:37
    728x90

     

     

    비동기 작업이 필요한 상황은 다음과 같이 다양합니다:

    • 대규모 동시 요청 처리: 

     

    • 실시간 데이터 스트리밍: 

     

    • 웹 소켓 통신: 

     

    • 외부 API 호출: 

     

    • 데이터베이스 작업: 

     

    • 백그라운드 작업: 

     

    • 긴 처리 시간 요청: 

     

    이러한 상황에서 비동기 작업을 활용하면 애플리케이션의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다.

     

     

    동기 작업은 비동기 작업보다 간단하고 직관적인 모델로, 특정 상황에서 여전히 필요하며 유용합니다. 아래는 동기 작업이 필요한 몇 가지 상황입니다.

     

    • 단순한 작업 처리: 

     

    • 데이터 무결성 유지: 

     

    • 순차적 작업 처리: 

     

    • 단순한 코드 구현:

     

    • 데이터 무결성 유지:

     

    • 종료 조건이 필요한 작업: 

     

     

    요약하면, 동기 작업은 간단하고 직관적이며 특히 순차적 작업 처리나 데이터 무결성 유지와 같은 상황에서 필요할 수 있습니다. 하지만 비동기 작업은 대량의 요청을 처리하고 응답 시간을 향상시키는 데 유용하며, 성능과 확장성을 극대화할 때 필요한 경우도 있습니다. 작업의 복잡성과 요구 사항에 따라 동기 작업 또는 비동기 작업을 선택하게 됩니다.

     

     

     

     

    데이터베이스 업데이트 작업을 동기 작업 또는 비동기 작업으로 구분해야 하는 것은 작업의 복잡성, 처리 시간, 데이터 무결성, 사용자 경험 및 시스템 요구 사항에 따라 다를 수 있습니다. 여러 상황에서 언제 어떤 방법을 선택해야 하는지 살펴보겠습니다:

     

     

    • 동기 작업을 사용해야 하는 경우:

     

     

     

    • 비동기 작업을 사용해야 하는 경우:

    이러한 결정은 프로젝트의 특정 요구 사항과 데이터베이스 업데이트 작업의 복잡성에 따라 달라집니다. 종종 혼합 모델을 사용하여 일부 작업은 동기적으로 처리하고 일부 작업은 비동기적으로 처리하도록 구현됩니다.

     

     

    Asyncio

     

    • Async / await 구문을 사용하여 동시성 코드를 작성하는 라이브러리
    • 고성능 네트워크 및 웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하는 여러 파이썬 비동기 프레임워크의 기반으로 사용됨

    asyncio는 종종 I/O 병목이면서 고수준의 구조화된 네트워크 코드에 가장 적합

     

    1. 파이썬 코루틴들을 동시에 실행하고 실행을 완전히 제어
    2. 네트워크 IO와 IPC를 수행
    3. 자식 프로세스를 제어
    4. 큐를 통해 작업을 분산
    5. 동시성 코드를 동기화

     

    저수준 api의 존재

     

     

    Eventloop

    이벤트 루프는 asyncio 응용프로그램의 핵심이다.

    • 비동기 태스크 및 콜백을 실행하고 네트워크 I/O 연산을 수행하며 자식 프로세스를 실행한다.

     

    일반적으로 asyncio.run()과 같은 고수준의 asyncio 함수를 사용하나, 세부적으로 제어하는 저수준 코드에 대해 알아보자.

     

    Asyncio.get_running_loop() : 현재 OS 스레드에서 실행중인 이벤트루프를 반환

    • RuntimeError : 이벤트 루프가 존재하지 않을 경우에 발생

     

    Asyncio.get_event_loop() : 현재의 이벤트 루프를 가져오며, 이벤트 루프 셋이없을 때 함수는 get_event_loop_policy().get_event_loop() 콜을 한다.

     

    Asyncio.set_event_loop(loop) : loop를 현재 스레드의 이벤트 루프로 지정한다

     

    Asyncio.new_event_loop() : 새로운 이벤트 루프를 현재 루프 객체로 생성하고 반환한다

     

    Loop.run_until_complete(future) : future가 완료할 때까지 실행한다

    인자가 코루틴 객체라면, asyncio.Task를 실행한다

     

    Loop.run_forever()

    Stop()이 호출될 때까지 이벤트 루프를 실행한다. Run_forever()가 호출되기 전에 stop()이 호출되었으면, 루프는 시간제한 0 으로 I/O 셀렉터를 한번 폴링하고, I/O 이벤트에 따라 예약된 모든 콜백을 실행한 다음 종료한다

     

    만약 stop()이 run_forever()가 실행중일 때 호출되면, 루프는 현재 걸려있는 콜백들을 실행한다음 종료한다.

    콜백에 의해 예약되는 새 콜백은 이 경우 실행되지 않는 대신, 

     

    Python의 비동기 프로그래밍 

    • 하나의 thread로 동시 처리 : 병렬 처리, 네트워크 통신, DB 연동을 효율적으로 수행
    • CPU 연산 대비 DB나 API와 연동과정에서 발생하는 대기 시간이 훨씬 길다는 것을 알 수 있음

    비동기 프로그래밍은 네트워크 통신이나 파일 입출력에 발생하는 대기 시간을 낭비하지 않고 그 시간에 CPU가 다른 처리를 할 수 있도록 하는데 non-blocking이라고 한다.

     

     

     

     

    Asyncio.gather() : 비동기 함수를 병렬로 실행하고 그 결과를 모아주는 역할

    인자로 넘어온 비동기 함수들을 동시에 실행하고 각 비동기 함수가 반환하는 결과들을 모아서 리스트로 반환

     

    비동기 처리는 정확히 실행 순서가 보장되지 않지만, CPU 놀리지 않고 불필요한 지연없이 3개의 요청이 실행되어야 한다

    728x90

    'Data Engineer' 카테고리의 다른 글

    concurrent.futures  (2) 2023.12.07
    Copy() 메서드  (1) 2023.12.03
    Airflow 연결 오류  (0) 2023.11.08
    Spark Structured Streaming_1  (1) 2023.10.29
    데이터 엔지니어링 수명 주기 전체에 걸친 기술 선택  (0) 2023.09.17
Designed by Tistory.