_thread — 저수준 스레딩 API
_thread — 저수준 스레딩 API
이 모듈은 여러 스레드(가벼운 프로세스 또는 태스크라고도 불러요)로 작업하기 위한 저수준 프리미티브를 제공해요. 여러 스레드가 전역 데이터 공간을 공유하면서 제어 흐름을 나눠 갖는데, 동기화를 위해 간단한 락(뮤텍스 또는 이진 세마포어라고도 불러요)을 제공해요. threading 모듈은 이 모듈 위에 더 쉽고 고수준인 스레딩 API를 제공해요.
버전 변경 (3.7): 이 모듈은 한때 선택적이었지만 이제 항상 사용 가능해요.
본문
상수와 함수
이 모듈은 다음 상수와 함수를 정의해요.
exception _thread.error: 스레드 전용 오류에서 발생해요. (버전 3.3부터 내장RuntimeError의 동의어)_thread.start_new_thread(function, args[, kwargs]): 새 스레드를 시작하고 그 식별자를 반환해요.args(반드시 튜플)의 인자 목록으로function을 실행하고, 선택적kwargs는 키워드 인자 사전이에요. 함수가 반환하면 스레드는 조용히 종료돼요. 처리되지 않은 예외로 끝나면sys.unraisablehook()이 호출돼요.SystemExit예외는 조용히 무시돼요. 감사 이벤트_thread.start_new_thread를 arguments, args, kwargs로 발생시켜요._thread.interrupt_main(signum=signal.SIGINT, /): 메인 스레드에 신호가 도착한 효과를 시뮬레이션해요. 스레드가 이걸로 메인 스레드를 중단할 수 있지만 즉시 일어난다는 보장은 없어요.signum이 주어지면 그 신호 번호를, 없으면signal.SIGINT를 시뮬레이션해요. 해당 신호가 파이썬에 의해 처리되지 않으면(signal.SIG_DFL또는signal.SIG_IGN으로 설정) 아무것도 하지 않아요. 참고로 이것은 실제 신호를 방출하지 않고 관련 핸들러(있다면)에 호출을 예약할 뿐이에요. 정말 신호를 보내려면signal.raise_signal()을 쓰세요._thread.exit():SystemExit예외를 발생시켜요. 잡히지 않으면 스레드가 조용히 종료돼요._thread.allocate_lock(): 새 락 객체를 반환해요. 처음엔 잠기지 않은 상태(unlocked)예요._thread.get_ident(): 현재 스레드의 '스레드 식별자'를 반환해요. 0이 아닌 정수이며, 그 값 자체에 별 의미는 없고 스레드별 데이터 사전의 인덱스 같은 매직 쿠키로 쓰기 위한 것이에요. 스레드가 종료되고 새 스레드가 생기면 식별자가 재사용될 수 있어요._thread.get_native_id(): 커널이 할당한 현재 스레드의 네이티브 정수 스레드 ID를 반환해요. 음이 아닌 정수예요. 이 값으로 시스템 전체에서 해당 스레드를 고유하게 식별할 수 있어요(스레드가 종료되기 전까지; 종료 후엔 OS가 재사용할 수 있어요). 가용성: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD. (3.8 추가, 3.13에서 GNU/kFreeBSD 지원 추가)_thread.stack_size([size]): 새 스레드를 만들 때 사용될 스레드 스택 크기를 반환해요. 선택적size는 이후 생성될 스레드에 쓸 스택 크기로, 0(플랫폼/설정 기본값) 또는 32,768(32 KiB) 이상의 양의 정수여야 해요. 지정하지 않으면 0이 사용돼요. 스택 크기 변경이 지원되지 않으면RuntimeError, 잘못된 값이면ValueError가 발생하고 스택 크기는 바뀌지 않아요. 32 KiB는 인터프리터 자체의 충분한 스택 공간을 보장하기 위한 현재 최소 지원값이에요. 어떤 플랫폼은 최소 > 32 KiB를 요구하거나 시스템 메모리 페이지 크기의 배수로 할당을 요구할 수 있어요. 가용성: Windows, pthreads._thread.TIMEOUT_MAX:Lock.acquire의 timeout 매개변수에 허용되는 최댓값이에요. 이보다 큰 timeout을 지정하면OverflowError가 발생해요. (3.2 추가)
class _thread.LockType
락 객체의 타입이에요. 락 객체는 다음 메서드를 가져요.
acquire(blocking=True, timeout=-1): 인자 없이 호출하면 조건 없이 락을 획득하고, 필요하면 다른 스레드가 놓을 때까지 기다려요 (한 번에 한 스레드만 락을 획득할 수 있어요 — 그것이 락이 존재하는 이유예요).blocking이 false면 기다리지 않고 즉시 획득 가능할 때만, true면 위처럼 조건 없이 획득해요. 양수timeout은 반환 전 최대 대기 시간(초)을 지정하고, 음수는 무한 대기를 뜻해요.blocking이 false면 timeout을 지정할 수 없어요. 락을 성공적으로 획득하면True, 아니면False를 반환해요. (3.2에서 timeout 추가, 3.14에서 Windows의 신호에 의한 중단 지원)release(): 락을 해제해요. 락은 앞서 획득되어야 하지만 반드시 같은 스레드가 획득했어야 할 필요는 없어요.locked(): 락의 상태를 반환해요. 어떤 스레드가 획득했으면True, 아니면False.
락 객체는 이 메서드들 외에도 with 문으로 사용할 수 있어요.
import _thread
a_lock = _thread.allocate_lock()
with a_lock:
print("a_lock is locked while this executes")
주의사항 (Caveats):
- 인터럽트는 항상 메인 스레드로 가요 (
KeyboardInterrupt예외는 그 스레드가 받아요). sys.exit()호출이나SystemExit예외 발생은_thread.exit()호출과 동등해요.- 메인 스레드가 종료될 때 다른 스레드가 살아남을지는 시스템 정의예요. 대부분의 시스템에서
try … finally절이나 객체 소멸자 실행 없이 죽어요.