본문 바로가기
Python

[파이썬] 쓰레드

by AI미남홀란드 2021. 1. 30.
728x90

** Thread

1. 프로그래밍에서의 작업 단위

-> process: 운영체제로 부터 자원을 할당받아서  동작하는 독립된 프로그램으로 실행중인 프로그램이라고도 한다.

     한번 실행하면 실행 종료시까지 다른 프로세스로 제어권을 옮길 수 없음

-> Thread: process 안에 존재하는 독립적으로 자원을 할당받아 동작하는 작은 프로그램인데 실행중에 다른 Thread로 제어권을 옮길 수 있습니다.

 

-> 하나의 프로세스 안에는 하나 이상의 스레드가 존재합니다.

-> process 와 Thread 를 합쳐서 Task라고 하기도 합니다

 

2. Thread 를 사용하는 이유ㅜ

-> cpu는 속도가 굉장히 빠른데 우리가 컴퓨터에게 내리는 명령은 cpu이외의 자원을 사용하게 되는데 이 때 CPU 이외의 자원을 사용할 때는 CPU는 IDEL 상태가 됩니다.

자원의 낭비가 발생합니다.

CPU이외의 자원을 사용할때 다른 작업을 수행시킬 수 있도록 해주는 개념이 Thread 입니다.

-> pc나 iot 또는 스마트폰 애플리케이션을 만들 때는 중요한 개념이다.

스마트폰 애플리케이션 에서는 네트워크 작업을 할 때 스레드를 사용하지 않으면 동작하지 않는다

-> 스레드가 굉장히 중요하다고 하는데 웹 프로그래밍을 할 때는 생성하는 경우가 거의 없습니다. 웹프로그래밍을 할때 대부분 순수 파이썬 모듈만 사용하지 않고 djanggo , flask 등을 사용하는데 이 프레임워크 들이 클라이언트의 요청이 오면 자동으로 스레드를 만들어서 처리하기 때문에 웹 프로그래밍에서는 직접 스레드를 만들지 않습니다.

 

3. python 에서 스레드를 만드는 방법

1) 스레드라는 클래스에 생성자에 target이라고 하는 매개변수에 함수를 대입하고 args라는 매개변수에 함수를 전달할 매개변수를

대입하면 된다.

2) Thread 클래스를 상속받아서 run이라는 함수를 재정의하면 됩니다.

 

4. 시작은 start()를 호출하면 됩니다

 

5. 대다수의 프로그래밍 언어가 스레드를 만드는 방법

-> Thread 라는 클래스를 상속받고 run이라는 메소드를 오버라이딩 한 후 이 메소드 안에 스레드로 동작할 내용을 작성합니다.

클래스의 인스턴스를 생성해서 start() 를 호출하면 됩니다.

 

6. Multi Thread

-> 하나의 스레드가 종료되기 전에 스레드가 시작해서 2개 이상의 스레드가 동작 중인 상태

동시에 여러 개의 스레드를 동작시키면 cpu 효율을 높일 수 있기 때문에 빠른 속도로 작업을 수행 할 수 있지만 이와 관련된 여러 가지 문제가 발생할 수 있습니다.

 

1) 너무 많은 스레드를 만들면 작업전환이 많이 이루어져 효율이 떨어질 수 있습니다

적절한 개수를 찾아야 하며 최근은 언어들에서는 이에 대한 해결책으로 co-routine 을 지원한다.

파이썬에서도 제공

 

2) 공유 자원의 문제

-> Mutual Exclusion(상호배제) : 하나의 작업이 완료되기 전에 공유 자원을 수정하면 문제가 발생할 수 있습니다.

Lock 이나 Synchronized 로 해결

 

-> 생산자와 소비자 문제 : 생산자와 소비자는 물건 진열대를 동시에 접근해서 수정할 수 있습니다.

실생활에서는 눈으로 보면서 접근하기 때문에 별다른 문제가 되지 않지만 , 컴퓨터 프로그램은 자원이 있는지 눈으로 확인 할 수 없기 떄문에 소비자가 자원이 없는데도 접근해서 자원을 소비할려고 하다가 작업도중 예외 발생으로 인해 팅겨 버립니다.

소비자가 자원을 사용할려고 했는데 자원이 없으면 wait 상태로 이동하고 생산자가 물건을 만들면 소비자에게 notification을 보내서 자원이 생성되었다고 알려줍니다.

스마트 폰의 알림을 android FCM 이라고 하고 ios는 APNS라고 합니다.

 

-> DeadLock : 2개 이상의 스레드가 상대방의 자원을 필요로 해서 무한 대기 상태에 빠지는 현상

상호배제를 적용한 스레드 안에서 다른 상호배제를 수행하는 스레드를 생성하지 않아야 합니다.

 

3) Semaphore

-> 동시에 실행되는 스레드의 개수를 설정할 수 있는 클래스

 

 

 

728x90

'Python' 카테고리의 다른 글

[파이썬] 자료규조  (0) 2021.01.31
[파이썬] 메모리관리  (0) 2021.01.30
[파이썬] 파이썬의 모듈  (0) 2021.01.30
[파이썬] 파이썬 정리2  (0) 2021.01.24
[파이썬] 파이썬의 정리  (0) 2021.01.23