본문 바로가기

23년 2학기 학교공부/컴퓨터네트워크

[CN] Blocking, Non-blocking, 동기, 비동기

목차

    728x90
    반응형
    SMALL

    📁 Blocking vs. Non-blocking

     

    1. Blocking : 프로세스가 시스템을 호출 하고나서 결과가 반환되기까지 다음 처리로 넘어가지 않음

     

    2. Non-blocking : 시스템을 호출한 직후에 프로그램으로 제어가 다시 돌아와서 시스템 호출의 종료를 기다리지 않고 다음 처리로 넘어갈 수 있음

     

     

    위 코드는 client에서 오류가 발생한다. 왜일까?

     

     

     

     

     

    📁 동기 vs 비동기

     

     

    1. 동기(synchronous) : 특정 작업이 끝나면 다음 작업을 처리하는 순차처리 방식

     

     

    2. 비동기(asynchronous) : 여러 작업을 처리하도록 예약한 뒤 작업이 끝나면 결과를 받는 방식. Cpu 연산이 DB/API 연산보다 훨씬 빠르다

     

     

    동시 프로그래밍 패러다임

    • 전통적 방법 • 쓰레드를 여러 개 이용 • thread safe 프로그래밍이 어려움 • thread safe: 여러 쓰레드가 어떤 함수/변수/객체에 접근하여도 프로그램 실행에 문제 가 없어야 함: thread-local storage, mutual exclusion(lock/semaphore), atomic operation, immutable object 등 • core개수보다 쓰레드가 많아지면 성능 향상이 거의 없거나 저조할 수 있음 • 최근 방법 • 하나의 쓰레드로 동시 처리하는 비동기 프로그래밍 • JavaScript, Python asyncio

     

     

     

     

    🌱 파이썬에서 비동기 프로그래밍

     

    • asyncio 모듈 이용 • 코루틴 • async def 로 만든 코루틴 (python 3.5 <= ) • 이벤트 루프 만들기 • loop = asyncio.new_event_loop() • asyncio.set_event_loop(loop) • 코루틴 객체를 이용하여 코루틴 실행결과 대기 • loop.run_until_complete(hello()) • 루프 닫기 • loop.close() • await: 코루틴 객체, 퓨처 객체, 태스크 객체 지정하여 끝날 때까지 기다 린 뒤 결과 반환

     

     

    🌱 비동기로 웹 페이지 가져오기

     

    동기: 여러 개의 웹페이지를 순차적으로 가져오기 • 웹페이지 1개 완료 후 다음 웹페이지 실행 • 비동기: 여러 개의 웹페이지를 동시에 가져오기 • 여러 개의 태스크 객체 생성 및 동시 실행 • asyncio.ensure_future(): 태스크 객체 생성 후 리스트로 만들기 • 태스크 리스트 결과 기다리기 • asyncio.gather() • 블로킹 I/O 함수(urlopen, response.read) 병행 실행: 쓰레드 병렬 실행 • run_in_executor()

     

     

     

    728x90
    반응형
    LIST