[AIFFEL 울산 1기] 30. 컴퓨터 파워 UP

학습 목표

  • 멀티태스킹, 병렬프로그래밍과 동시성에 대해 이해합니다.
  • 파이썬으로 멀티스레드와 멀티프로세스를 구현하는 법에 대해 학습합니다.
  • 파이썬의 concurrent.futures를 이용한 병렬 프로그래밍을 구현해 봅니다.

후기


학습 내용

30. 컴퓨터 파워 UP

30.1. 멀티태스킹

30.1.1 멀티태스킹이란?

컴퓨팅 자원을 최적화하는 방법, 즉 병렬 컴퓨팅, 분산 컴퓨팅 등의 개념

멀티태스킹의 2가지 동작 방식

  • 동시성(Concurrency)
    하나의 processor가 여러 가지 task를 동시에 수행하는 개념

  • 병렬성(Parallelism)
    유사한 task를 여러 processor가 동시에 수행하는 것

동기 vs 비동기 (Synchronous vs Asynchronous)

  • 동기(synchronized) 방식
    앞 작업이 종료되기를 무조건 기다렸다가 다음 작업을 수행하는 것

    • 어떤 일이 순차적으로 실행됨.
    • 요청과 요청에 대한 응답이 연속적으로 실행됨 (따라서 요청에 지연이 발생하더라도 계속 대기한다.)
  • 비동기(asynchronous) 방식
    바운드되고 있는 작업을 기다리는 동안 다른 일을 처리하는 것

    • 어떤 일이 비순차적으로 실행됨.
    • 요청과 요청에 대한 응답이 연속적으로 실행되지 않음.
    • 특정 코드의 연산이 끝날 때까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하며, 중간에 실행되는 코드는 주로 콜백함수로 연결하기도 한다.

I/O Bound vs CPU Bound

  • I/O 바운드: 입력과 출력에서의 데이터(파일)처리에 시간이 소요될 때.
  • CPU 바운드: 복잡한 수식 계산이나 그래픽 작업과 같은 엄청난 계산이 필요할 때.

30.1.2 프로세스, 스레드, 프로파일링

Process(프로세스)?

프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리상에서 실행되는 작업 단위

Thread(스레드)

스레드(thread)는 어떠한 프로그램 내, 특히 프로세스 내에서 실행되는 흐름의 단위

프로파일링(Profiling)

코드에서 시스템의 어느 부분이 느린지 혹은 어디서 RAM을 많이 사용하고 있는지를 확인하고 싶을 때 사용하는 기법

30.1.3 Scale Up vs Scale Out

Scale-Up은 한 대의 컴퓨터의 성능을 최적화시키는 방법이고 Scale-Out은 여러 대의 컴퓨터를 한 대처럼 사용하는 것

30.2. 파이썬에서 멀티스레드 사용하기

30.2.1 스레드 생성

파이썬에서 멀티스레드의 구현은 threading 모듈을 이용

멀티스레드

  • threading 모듈을 import
  • 클래스에 Thread를 상속받음

스레드 생성 확인

함수 이름을 출력하면 함수 객체를 확인할 수 있습니다.

30.2.2 스레드 생성 및 사용

  • 그대로 인스턴스화하여 스레드를 생성할 수도 있습니다.
  • 인스턴스화 하려면 Thread 클래스에 인자로 target과 args 값을 넣어 줍니다. args에 넣어 준 파라미터는 스레드 함수의 인자로 넘어갑니다.
t = Thread(target=함수이름, args=())
  • Thread 클래스에는 start(), join() 같은 스레드 동작 관련 메소드가 있습니다. Thread로 실행할 함수를 정의한 후 start() 를 통해 스레드를 실행합니다.

30.3. 파이썬에서 멀티프로세스 사용하기

파이썬에서 멀티프로세스의 구현은 multiprocessing 모듈을 이용해서 할 수 있습니다.

프로세스 생성

Process 인스턴스를 만든 뒤, target 과 args 파라미터에 각각 함수 이름과 함수 인자를 전달합니다.

프로세스 사용

Process 클래스는 start(), join(), terminate() 같은 프로세스 동작 관련 메소드가 있습니다.

p = mp.Process(target=delivery, args=())
p.start() # 프로세스 시작
p.join() # 실제 종료까지 기다림 (필요시에만 사용)
p.terminate() # 프로세스 종료

30-8 봐야함

좋은 웹페이지 즐겨찾기