• 공부한 날짜: 2021.12.01
  • Multithreading- Thread - Lock, DeadLock
  • Keyword: Lock, DeadLock, Race Condition, Thread synchronizatin

 

Part 01

  • 용어 설명

1. 세마포어(Semaphore): 프로세스간 공유된 자원에 접근 시 문제 발생 가능성 -> 한 개의 프로세스만 접근 처리 고안(경쟁 상태 예방)

2. 뮤텍스(Mutex): 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것 -> 경쟁 상태 예방

3. Lock : 상호 배제를 위한 잠금(Lock) 처리 -> 데이터 경쟁 (추가로 찾아보기)

4. DeadLock: 프로세스가 자원을 획득하지 못해 다음 처리를 못하는 무한 대기상황(교착상태)

5. Thread synchronization(스레드 동기화)를 통해서 안정적으로 동작하게 처리한다. (동기화 메소드, 동기화 블럭)

 

  • Semaphore vs Mutex

1. 세마포어와 뮤텍스 개체는 모두 병렬 프로그래밍 환경에서 상호배제를 위해 사용한다

2. 뮤텍스 개체는 단일 스레드가 리소스 또는 중요 섹션 소비를 허용 

3. 세마포어는 리소스에 대한 제한된 수의 동시 액세스를 허용 

4. 세마포어는 여러 프로세스일때 사용되는 걸로 생각하면 됨. 세마포어가 단일작업일 경우 뮤텍스와 원리가 동일하다 

 

 

 

  • 라이브러리 import 

 

  • FakeDataStore class 구현 

 

  • 메인 함수 구현 

 

이렇게 했을 때 문제점, 총 실행 횟수는 3번인데 스레드들이 자원에 동시에 접근하기 때문에 정확한 결과를 출력하지 않음

-> Lock을 이용함으로써 문제를 해결할 수 있다. 

 

 

마지막 줄에 3이 아닌 2가 출력된다. 엄청난 오류임

 

 

Part 02 

 

  • Lock 이용해서 구현 

 

  • 방법 #1: self._lock.acquire() , self._lock.release()로 구현 

 

  • 방법 #2 : with self._lock으로 구현 

 

  • 메인 함수 

 

 

-> 위와 같은 방법으로 구현하면 오류없이 3을 출력함을 확인할 수 있다. 스레드 접근에 Lock을 걸어서 정확하게 처리하는 법 익히기. 

 

  • 공부한 날짜: 2021.12.01
  • Keyword- Many Threads, concurrent.futures,(xxx)PoolExecutor

 

  • 그룹 스레드

1. Python 3.2이상 표준 라이브러리 사용

2. concurrent.futures

3. with 사용으로 생성,소멸 라이프사이클 관리 용이

4. but, 디버깅 하기가 난해함(단점)

5. 대기중인 작업 -> Queue에 저장 -> 완료 상태 조사 -> 결과 또는 예외 반환 -> 단일화(캡슐화)

 

  • 라이브러리 import 및 스레드 실행 함수 구현

-result 반환해야 로그로 값 출력 가능. return 안하면 None으로 출력됨 

 

  • 메인 함수 구현- logging format 설정 

 

  • 메인 함수- 실행방법 #1: ThreadPoolExecutor로 변수 할당(executor)해서 submit() 함수 이용 

 

  • 메인 함수 - 실행방법 #2: with문 이용해서 라이프 사이클 조절할 수 있음. 

 

  • 메인 함수 실행 

 

  • 공부한 날짜: 2021.12.01 
  • Multi_threading- Basic
  • main에서 일이 끝났어도 sub에서 안끝났으면 sub 계속 진행한다. 자기가 맡은일 끝까지 함
  • 스레드 실행순서에 대해서 공부

 

  • 메인영역(logging format 설정/ 함수인자 확인/ 서브 스레드 시작 부분으로 나눌 수 있음) 

 

-스레드 실행 함수 

- main 선언 및 logging format 설정 

: basicConfig, logging.INFO 개념 정리하기 

 

- 함수인자 확인 

 

-서브 스레드 시작 및 탈출로그 입력 

 

Part 02 

 

  • Multithreading - Thread- Daemon, Join

 

  • Daemon Thread(데몬 스레드)

1. 백그라운드 실행

2. 메인스레드 종료시 즉시 종료

3. 주로 백그라운드 무한 대기 이벤트 발생 실행하는 부분 담당 -> JVM(가비지 컬렉션), 자동 저장 기능에서 사용됨 

4. 일반 스레드는 작업 종료시까지 실행 

 

-위의 코딩과 비슷하게 구현하지만, 다른 점은 threading.Thread()에 range()와 daemon=True가 추가되고 실행 함수가 약간 달라졌다. 

 

  • 스레드 실행 함수(파라미터로 name,d를 받음)

 

  • 메인 영역 - Logging format 설정 

 

-함수 인자 확인: threading.Thread()

-서브 스레드 시작 

-DaemonThread 확인->True 출력됨 

  • 공부한 날짜: 2021.12.01

 

  • Multithreading - Difference between Process and Thread
  • Keyword- Process, Thread

 

***프로세스와 스레드의 차이 정확히 알아두기& 운영체제에 포함되어 있는 프로세스 정확히 알고 답변할 줄 알아야한다(기술 면접대비)

 

  1. 프로세스
  • -운영체제에서 할당받는 자원 단위(실행 중인 프로그램) ->>>> 외워!!
  • -CPU 동작 시간, 주소 공간은 독립적이다. 
  • -최소 1개의 메인 스레드 보유
  • -파이프, 파일, 소켓 등을 사용해서 프로세스간 통신(cost 높음)-> Context Swtiching(문맥교환)

 

 

2. 스레드 

  • 프로세스 내에 있는 실행 흐름 단위
  • 프로세스 자원을 사용함
  • Stack만 별도 할당. 나머지는 공유(Code, Data, Heap)
  • 메모리 공유(변수 공유)
  • 한 스레드의 결과가 다른 스레드에 영향을 끼친다 
  • 동기화 문제는 정말 주의(디버깅 어려움)

 

3. 멀티 스레드

  • 한 개의 단일 어플리케이션(응용프로그램)-> 여러 스레드로 구성 후 작업 처리
  • 시스템 자원 소모 감소(효율성), 처리량 증가(Cost 감소)
  • 통신 부담 감소, 디버깅 어려움, 단일 프로세스에는 효과가 미약함, 자원 공유 문제(교착상태), 프로세스에 영향을 준다 

 

4. 멀티 프로세스

  • 한 개의 단일 어플리케이션(응용프로그램)-> 여러 프로세스로 구성 후 작업 처리 
  • 한 개의 프로세스 문제 발생은 확산 없음(프로세스 kill)
  • 캐시 체인지, cost 비용 매우 높음(오버헤드), 복잡한 통신 방식 사용 

 

5. GIL(Global Interpreter Lock)

  • CPython -> Python(bytecode) 실행 시 여러 thread 사용할 경우 단일 스레드만이 Python object에 접근하게 제한하는 mutex가 있음 
  • CPython 메모리 관리라 취약하기 때문에(Thread-safe) 단일 스레드만으로도 충분히 빠르다
  • 프로세스 사용 가능(Numpy/Scipy)등 외부 영역에서 효율적인 코딩 
  • 병렬 처리는 MultiProcessing, asyncio등 선택지가 다양하다
  • thread 동시성 완벽 처리를 위해 Jython,IronPython,Stackless Python 등이 존재 

 

-리소스 가장 적게 잡아먹고, 안정적으로 동작하는 방식으로 멀티프로세싱을 작성해야한다

 

+ Recent posts