- 파이썬 메모리 관리
- 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
- 파이썬 : Single Thread, Global Interpreter Lock, ... -> 특정 시점에 하나의 코드만 -> 멀티코어 병렬처리 X
- 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 : ...
- spawn :
- 셋팅
- 생성전에 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() 등등등
- subprocess.call(args, stdin, stdout, stderr, shell, timeout, cwd, ...) : 실행 -> 종료 대기 -> 리턴코드 반환.
- https://blog.naver.com/sagala_soske/221280201722
- 1,2,3 편...
- https://hbase.tistory.com/341 참고
- 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 |