Home > PYTHON > Module > 멀티 스레드와 멀티 프로세스

멀티 스레드와 멀티 프로세스
python library threading multiprocessing

threading&multiprocessing #


threading #


스레드를 늘려서 다른 코드들이 동시에 작동하는것 처럼 만들어주는 라이브러리

class threading.Thread(target=None, name=None, args=(), kwargs={}, *, daemon=None) ***

  • 스레드 생성을 하는 클래스선언
  • target 매개변수는 스레드에 함수를 할당할 수 있다.
  • name 매개변수는 스레드에 이름을 할당할 수 있다.
  • args 매개변수는 스레드에 가변 매개변수들을 할당할 수 있다.
  • kwargs 매개변수는 스레드에 키워드 가변 매개변수들을 할당할 수 있다.
  • demon 매개변수는 True/false를 받으며 스레드를 데몬 스레드로 만들어서 메인스레드와 운명을 같이 하게 된다.

.start() ***

  • 스레드 객체의 작동 메서드(.run() 메서드를 작동시킨다.)

.run()

  • 스레드 서브 클래스를 만들때 추가적으로 작동 하고 싶은것을 선언할 수있다.

.join(timeout=None) ***

  • 스레드가 종료 될때까지 이후의 코드를 작동하지 않는다.
  • timeout 매개변수는 스레드에 시간제한을 줄 수 있으며, 시간제한을 초과하면 스레드를 멈춰줘야한다.

.is_alive()

  • 스레드가 작동중인지 확인 할 수 있으며, 작동시 True를 반환한다.

파이썬의 스레드는 하나의 프로세스에서 여러개의 스레드를 병렬 처리한다. 이때 공유되는 자원들을 동시에 변형가하면 충돌을 발생해 무시될 수 있다. 다음에 소개 할 threading.Lock() 클래스는 이를 해결해준다.

class threading.Lock() ***

  • 스레드의 락 기능을 선언하는 클래스

.acquire(blocking=True, timeout=- 1) ***

  • 락 기능이 작동중인지 작동중이지 않은지 수 있는 메서드.
  • blocking 매개변수가 True이면 락을 작동(코드 멈춤)하고 True를 반환하고, False이면 락을 작동시키지 않고(코드 진행) 추후에 True/False를 반환합니다.(default: true)

.release() ***

  • 스레드의 락을 해제하며 해제된 스레드에서 작동시 런타임 오류발생.
    with구문을 활용하여 acquire()과 release()를 한번에 관리가능하다.

.locked()

  • 스레드가 잠겨있으면 True반환.

락을 사용하는데 A함수와 B함수를 사용하고 A함수가 B함수를 재사용하는 재귀형식의 스레드활용시에는 acquire의 사용에 있어 오류를 발생할 수 있는데 이때 사용하는것이 RLock이다.

class threading.RLock()

  • 스레드의 락 기능을 선언하는 클래스

.acquire(blocking=True, timeout=- 1)

  • 락 기능이 작동중인지 작동중이지 않은지 수 있는 메서드.
  • blocking 매개변수가 True이면 락을 작동(코드 멈춤)하고 True를 반환하고 재사용시에 1을 반환한다. False이면 락을 작동시키지 않고(코드 진행) 추후에 True/False를 반환합니다.(default: true)

.release()

  • 스레드의 락을 해제하며 해제된 스레드에서 작동시 런타임 오류발생.
    with구문을 활용하여 acquire()과 release()를 한번에 관리가능하다.

.locked()

  • 스레드가 잠겨있으면 True반환.

이외에도 많은 함수들이 존재하지만 주로 사용하는 함수만 정리했으며 추가적인 자료는 아래를 참고한다.
원문

from threading import Thread

def subthread():
  <output>

worker = Thread(target=subthread) # worker에 서브쓰레드 할당
worker.daemon = True # 메인쓰레드가 종료될때 sub도 종료됨(선택)
worker.start() # worker 실행
worker.join() # worker가 끝날때까지 대기(선택)

<main program>

multiprocessing #


프로세스를 늘려서 다른 코드들을 동시에 작동시켜주는 라이브러리
multiprocessing의 경우 threading보다 더 다양한 클래스와 메서드들을 가지고 있다.

class multiprocessing.Pool(processes=None) ***

  • 멀티 프로세스중 초기 지정한 프로세스수를 활용하는 클래스선언
  • processes 매개변수는 멀티프로세스에서 사용할 프로세스의 갯수를 나타내며 os.cpu_count()를 활용하면 나내 컴퓨터의 최대 프로세스수를 알 수있다. 최대치를 넘는 프로세스는 오류를 유발할 수 있다.
def subprocess(<input>):
  <output>

if __name__ == '__main__':
  with Pool(5) as p:
    print(p.map(subprocess, <input>))

class multiprocessing.Process() ***

  • 멀티 프로세스중 스레드와 유사한 작동방식을 가지며 각각의 프로세스를 관리하는 클래스선언
    참조
import multiprocessing as mp

def subprocess():
  <output>

if __name__ == "__main__":
  worker = mp.Process(target=subprocess, args=(...)) #  worker에 서브프로세스 할당
  worker.daemon = True # 메인쓰레드가 종료될때 sub도 종료됨(선택)
  worker.start() # worker 실행
  mp.current_process() # PID값을 반환해줌(선택)
  worker.is_alive() # PID값을 반환해줌(선택)
  worker.terminate() # 강제종료(선택)
  worker.join() # worker가 끝날때까지 대기(선택)
	
  <main program>

class multiprocessing.Queue(maxsize=0) ***

  • 멀티 프로세스중 프로세스수간 FIFO 데이터 전송을 위한 클래스선언
  • maxsize 매개변수는 큐의 최대사이즈를 입력받으며 0은 제한없음을 의미한다.

.get() ***

  • 큐에 있는 값을 하나 받아온다.

.put() ***

  • 큐에 값을 하나 넣는다.

class multiprocessing.Pipe(duplex=None) return(conn1, conn2) ***

  • 멀티 프로세스중 프로세스수간 한쌍으로 데이터 전송을 위한 클래스선언
  • duplex 매개변수는 True일 경우 양방향 통신 False일 경우 단방향 통신(conn1: reciver, conn2: sender)으로 활용된다.

conn.send() ***

  • 파이프에 값을 넣는다.

conn.recv() ***

  • 파이프에서 값을 받아온다.

class multiprocessing.Lock() ***

  • 락을 관리하는 멀티 프로세스중 스레드 락과 유사한 작동방식을 가지며 각각의 프로세스를 관리하는 클래스선언
    참조

class multiprocessing.Manager() ***

  • 멀티 프로세스의 자원을 안전하게 관리하기 위한 클래스선언
  • 다음과 같은 지원을 한다.(더 있음)
    • .list()
    • .dict()
    • .Lock()
    • .RLcok()
    • .Array()

이외에도 많은 함수들이 존재하지만 주로 사용하는 함수만 정리했으며 추가적인 자료는 아래를 참고한다.
원문