• 파이썬 메모리 관리
    • https://dc7303.github.io/python/2019/08/06/python-memory
    • https://jay-ji.tistory.com/105
    • https://kimwooseok.com/python/2022/07/25/python_memory_management
    • https://yomangstartup.tistory.com/105
  • threading
    • 파이썬 : Single Thread, Global Interpreter Lock, ... -> 특정 시점에 하나의 코드만 -> 멀티코어 병렬처리 X
      • -> Interleaving 방식으로 코드를 분할하여 처리 해야지, 단순 threading 만으로는 제한적.
      • -> CPU 병목과 I/O 처리를 잘 분리하여 한다면... 괜춘 ㅎㅎ
    • fork 와 join
    • ...
    • import threading
      
      thread_list = list()
      thread = threading.Thread(target=함수, args=(list(thread_list), ...))
      thread.daemon = True  # 데몬=백그라운드에서 실행되어, 메인종료시 같이 종료.
      thread.start()
      thread_list.append(thread)
      
      def 함수(wait_list, ...):
      	...
          for other in wait_list:
              other.join(timeout=10)  # 동시실행 -> 순차리턴
          return
  • concurrent.futures
    • 동시에 실행시키고, 편하게 결과를 다 받을수 있는...
    • with concurrent.futures.ProcessPoolExecutor() as executor:
      • result_list = [executor.submit(함수) for _ in range(3)]
  • multiprocessing
    • 독립된 프로세스로 멀티코어 병렬처리 O (데이터 공유는? multiprocessing.Value | Array 등등...)
    • 방식
      • spawn :
        • 스포닝풀(?) 산란의 못... 새로운 파이썬 인터프리터으로 시작.
        • run에 필요한 최소한 자원만 상속. (Unix, Windows 모두 되는데~ 각각 "import 모듈" 등등도 다 다시함) 
      • fork : os.fork()를 사용하여, 부모와 똑같은 자식 프로세스으로 시작. (Unix 의 기본옵션)
      • forkserver : ...
    • 셋팅
      • 생성전에 multiprocessing.set_start_method('spawn') 으로가능.
      • ctx = multiprocessing.get_context('fork') 식으로, Multi-Context 가능한데~ 서로다른 ctx간 ps끼리는 호환안됨!
    • Queue & Pipe : 프로세스 간 통신 채널. [단방향|양방향]
    • https://newsight.tistory.com/323
    • import multiprocessing
      from multiprocessing import Process, Queue, Pool
      
      if __name__ == '__main__':
      	queue = Queue(maxsize=1000)
      
      	proc = Process(target=함수, kwargs={'queue': queue})
      	proc.start()
      
      	queue.put(데이터)
      
      	proc.terminate()  # 루프중일테고 proc.close() 하면, 익셉션 발생!
      	proc.join()
      	print(proc.is_alive())
      	exit(0)
      
      	ps_pool = Pool(5)  # 5개의 풀생성
      	ps_pool.map(target=함수, ...)  # target 할당 등등
          ...
    • 우종 : https://cuyu.github.io/python/2016/08/15/Terminate-multiprocess-in-Python-correctly-and-gracefully
  • subprocess
    • https://hbase.tistory.com/341 참고
      • subprocess.call(args, stdin, stdout, stderr, shell, timeout, cwd, ...) : 실행 -> 종료 대기 -> 리턴코드 반환.
        • stdin out err : 표준 입출력 등의 리다이렉션을 지정. (PIPE, STDOUT, DEVNULL)
        • shell : 별도의 서브 쉘을 실행하여, 그 파이프라이닝 등등 활용좋음! (이떈, args 를 ""문자열 형태로 쓰는게 좋음)
        • cwd : 명령어가 실행될 current working directory 지정가능.
      • subprocess.check_call() : 실행 시키고, 정상 종료가 되었는지 확실히 할수있음. 
      • subprocess.check_output() : 해당 결과 출력을~ 파이썬 변수로 받아 로직에서 활용 할수있음.
        • check_ 의미 : 비정상 종료시... CallProcessError 익셉션으로 리턴코드 등등 반환.
        • 예) stderr=subprocess.PIPE : 표준 에러 출력도 -파이프-> 변수으로 넘어옴. 
      • subprocess.run(...,  input, capture_output, check, encoding, env, ...) : 위 기능을 다 종합한 상위함수.
        • ...
      • subprocess.Popen(...)
        • Popen 클래스를 직접 사용하여, 더 유연한 활용이 가능.
        • 위 함수들도 내부적으로 Popen() 사용하고, 그 결과를 기다리는 "블로킹 함수"임.
        • Popen 클래스 메소드 : .poll(), .wait(), .communicate(), .send_signal(), .terminate(), .kill() 등등등
    • https://blog.naver.com/sagala_soske/221280201722
      • 1,2,3 편...
  • schedule
    • https://schedule.readthedocs.io/en/stable/examples.html
    • import schedule
      
      schedule.every().day.at("00:00:00").do(함수, ...)
      for i in range(0, 10):
      	schedule.run_pending()
          time.sleep(1)
      ...
  • signal
    • import signal
      
      def handler(self, signum, frame):
      	print(f"handler() : signum = {signum} , frame = {frame}")
      	print(f"handler() : Ctrl+C 신호를 수신했습니다.")
      	return
      
      signal.signal(signal.SIGINT, handler)
    • https://jhnyang.tistory.com/143
    • ctrl + c : SIGINT 인터럽트
    • ctrl + d : EOF (시그널은 아니지만...)
    • ctrl + \ : SIGQUIT
    • ctrl + z : SIGTSTP
    • kill : 프로세스에 시그널을 보내는 명령어
    • ...

-끝-

'랭귀지&프레임웤' 카테고리의 다른 글

python async  (0) 2023.04.07
파이썬 메모장  (0) 2023.04.07
python ruff & uv  (0) 2022.10.26
Python DI  (0) 2022.09.04
FastAPI 심화  (0) 2022.09.04

+ Recent posts