공유 메모리에 여러 실행 흐름이 접근하면 연산 사이가 끼어들 수 있다. 한 줄처럼 보여도 여러 바이트코드와 외부 호출로 나뉜다.
from threading import Lock
lock = Lock()
games = 0
def add_game():
global games
with lock:
games += 1락은 가능한 한 짧게 잡고, 여러 락의 획득 순서를 고정해 교착을 막는다. Queue는 생산자와 소비자 사이의 데이터 전달과 대기를 함께 처리한다.
multiprocessing은 자식 프로세스에 데이터를 복사하거나 직렬화해 보낸다. 모듈 최상위에서 프로세스를 바로 만들지 말고 `if __name__ == "__main__":` 아래에서 시작한다. 특히 spawn 시작 방식에서 그렇지 않으면 자식이 다시 자식을 만든다.
큰 배열은 매번 직렬화하는 비용이 크다. 공유 메모리나 NumPy의 병렬 라이브러리를 검토하되, 먼저 단일 프로세스 병목을 프로파일링한다.
댓글
0개아직 댓글이 없습니다.