• 공부한 날짜: 2021.11. 
  • Keyword: Naming, parallel processing
  • 라이브러리 import

 

  • 제곱함수 정의

-os.getpid():

-current_proceess().name: 

 

  • main()

-os.getpid()로 parent의 process id 설정하기 

 

  • 프로세스 생성 및 배열에 담은 후 실행하기(t.start())/ for문 총 8번 실행

 

  • process.join()이므로 실행 프로세스 하나씩 수행됨

 

  • 출력 결과 

 

  • process.join()을 없애고 실행했을때
  • 바로 main 함수 출력문 출력되고, 나머지 프로세스 실행됨

  • 공부한 날짜: 2021.11.

 

-이전 내용들과 겹치는 내용이 있지만 반복적인 학습을 위해 또 포스팅함

 

  • 서브 프로세스 함수(proc_func) 정의

 

  • main 함수 정의 
  • logging format 설정
  • logging.basicConfig(format=,level=, datafmt=)

 

  • 함수 인자 확인
  • Process(target=, arg=(여기에 들어가는게 proc_func의 파라미터가 됨)

 

  • p.start(): 프로세스 시작 

 

  • p.join(): 쓰레드/ 프로세스가 작업을 완료될 때까지 기다리게 하는 메서드.

-프로세스는 여러번 join 될 수 있으며, 교착상태를 유발할 수 있으므로 프로세스는 자기 자신을 Join할 수 없다.

-프로세스가 시작되기 전에 프로세스에 조인하려고 하면 에러가 발생함

-p.join()을 너어주지 않으면 자식 프로세스는 유휴상태(idle)에 들어가고, 종료되지 않아 좀비 프로세스가 되어 손수 kill 해줘야함

-출처: http://pertinency.blogspot.com/2019/10/join.html

 

  • p.is_alive(): 프로세스가 살아있는지 아닌지를 반환한다. 프로세스 객체는 start() 메서드가 반환하는 순간부터 자식 프로세스가 종료될때까지 살아있다. 자식 프로세스가 종료되면 프로세스는 종료되므로 출력값이 false가 되는건가?

-출처: https://docs.python.org/ko/3/library/multiprocessing.html

 

  • 메인 함수 시작 

 

 

  • p.join()을 넣었을 때와 안 넣었을 때의 결과 값 비교 

 

-p.join() 존재 

 

 

-p.join() 비존재

: alive의 값이 True가 되었고, 마지막이 아닌 중간에 출력되었다

  • 공부한 날짜: 2021. 11.

 

  • Parallelism(병렬성)

- 완전하게 동일한 타이밍(시점)에 태스크 실행

-다양한 파트로 나눠서 실행(합을 나눠서 구하고, 취합할 수 있음)

-멀티프로세싱에서 CPU가 1Core인 경우 만족하지 않는다

-딥러닝, 비트코인 채굴 등에 사용할 수 있음

 

 

  • Process 와 Thread 차이 비교
Process  Thread
독립된 메모리  공유 메모리 
많은 메모리 필요 적은 메모리 필요 
좀비(데드) 프로세서 생성 가능 좀비(데드) 스레드 생성 쉽지 않음 
오버헤드 큼  오버헤드 작음 
생성/소멸 다소 느림  생성/소멸 빠름
코드 작성이 쉽지만 디버깅이 어려움 코드 작성이 어렵고, 디버깅도 어려움

 

  • 공부한 날짜: 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을 걸어서 정확하게 처리하는 법 익히기. 

 

+ Recent posts