스레드 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""스레드는 프로세스의 메모리를 함께 쓰고, 프로세스끼리는 따로 쓴다는 것을 확인한다.
또 입출력을 기다리는 일(여기서는 sleep)을 스레드로 나누면 기다림이 겹쳐 빨라진다는 것도 확인한다
(문서의 RPC 예: 서버 두 곳에 요청을 보내고 답을 기다림)."""
import multiprocessing as mp
import threading
import time

counter = {"value": 0}


def bump():
    counter["value"] += 1


def fake_rpc(results, i, delay):
    time.sleep(delay)          # 원격 서버의 답을 기다리는 시간
    results[i] = f"server{i}"


if __name__ == "__main__":
    # 1. 스레드: 같은 프로세스의 메모리를 함께 본다
    t = threading.Thread(target=bump)
    t.start(); t.join()
    assert counter["value"] == 1, counter

    # 2. 프로세스: 자식은 자기 복사본을 고친다. 부모의 값은 그대로다
    p = mp.get_context("spawn").Process(target=bump)
    p.start(); p.join()
    assert counter["value"] == 1, counter

    # 3. RPC 두 번, 각 0.3초 대기
    delay = 0.3
    start = time.perf_counter()
    res = [None, None]
    for i in range(2):
        fake_rpc(res, i, delay)                     # 스레드 하나: 차례로 기다림
    single = time.perf_counter() - start

    start = time.perf_counter()
    res = [None, None]
    ths = [threading.Thread(target=fake_rpc, args=(res, i, delay)) for i in range(2)]
    for th in ths: th.start()
    for th in ths: th.join()                        # 서버마다 스레드 하나: 함께 기다림
    multi = time.perf_counter() - start
    print(f"스레드 하나 {single:.2f}s, 서버마다 스레드 {multi:.2f}s")
    assert res == ["server0", "server1"]
    assert single >= 2 * delay and multi < 1.5 * delay
    # 카드 C4: 디스크 40ms + 계산 2ms, 요청 5개
    assert 5 * (40 + 2) == 210                      # 스레드 하나로 차례로
    assert 40 + 5 * 2 == 50                         # 읽기는 겹치고 계산은 차례로
    print("ALL CHECKS PASSED")