thread multiprocessing

markyang92·2023년 9월 20일
0

python

목록 보기
42/42
post-thumbnail
  • 병렬 처리는 Multiprocessing, asyncio 선택지 다양
  • thread 동시성 완벽 처리를 위해 Jython, IronPython, Stackless Python 등이 존재

thread 기초


join 사용

  • Main-ThreadSub-Thread종료 기다림


DaemonThread

  • DaemonThread
    • 백그라운드에 실행
    • 메인스레드 종료시 즉시 종료
    • 주로 백그라운드 무한 대기 이벤트 발생 실행하는 부분 담당


class 상속 받아 사용하기

import threading
import subprocess

class AppRunner(threading.Thread):
    def __init__(self, cmd: str):
        threading.Thread.__init__(self) # threading.Thread 생성자 실행
        self.cmd=cmd
    
    def run(self): # run은 외부에서 threading.Thread object를 start() 함수에 의해 호출된다.
        # threading.Thread Object가 실행할 것 구성하면됨
        print(self.cmd)
        self.proc=subprocess.Popen(slef.cmd, shell=True, executable='/bin/bash', \
            stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
        try:
            out, err = self.proc.communicate() # stdout, stderr Tuple return, 위 subprocess object를 wait함
        except: subprocess.TimeoutExpired:
            print("[ERROR]: rsync timeout expired") # 위 communicate(timeout=2.5) 등으로 지정한다면, timeout 시 이 exception 발생
        else:
            if out != '':
                print(out)  # 제대로 동작이 완료되고 STDOUT 출력물이 있다면 출력
        # subprocess Object의 return code는 자동으로 subproces Object의 returncode에 set됨


if __name__=='__main__':
    rsync_cmd="rsync -aq $HOME/ffmpeg/ $HOME/dummy" # 간단한 rsync 명령어
    rsync1=AppRunner(rsync_cmd) # 명령어를 넣어 object 생성
    rsync1.start() # thread start! -> rsync1.run()을 자동 실행함
    rsync1.join()  # thread join
    if rsync1.proc.returncode == 0:
        print("[INFO]: {:s} return {}".format(rsync1.cmd, rsync1.proc.returncode)
    else:
        print("[ERROR]: {:s} return {}".format(rsync1.cmd, rsync1.proc.returncode)

ThreadPoolExecutor

  • 그룹스레드
    • Python 3.2 이상
    • concurrent.futures
    • with 사용으로 생성, 소멸 라이프사이클 관리 용이
    • 디버깅 난해(단점)
    • 대기 중인 작업 -> Queue -> 완료 상태 조사 -> 결과 또는 예외 -> 단일화(캡슐)

기초


with사용


Lock, Deadlock

  • Lock: 상호 배제를 위한 잠금(Lock) 상태: 데이터 경쟁
  • Deadlock: 프로세스가 자원을 획득하지 못해 다음 처리를 못하는 무한 대기 상황(교착 상태)
  • Lock이 필요한 이유를 보자.
    • 이 경우 3이 되어야 하는데, 2가 나온다.

threading.Lock(), acquire(), release()


with文 사용


Prod and Cons Using Queue

  • Python Event 객체
    • Flag 초기값 0
    • Set() -> 1
    • Clear() -> 0
    • Wait() 1->리턴, 0->대기
    • isSet() -> 현 플래그 상태


multiprocessing


terminate(): 프로세스 강제종료


예제


ProcessPoolExecutor

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글