스레드에는 5가지 상태가 있습니다.
새로 만들기, 준비됨, 실행 중, 차단됨, 종료됨.
차단에는 세 가지 상황이 있습니다.
동기 차단은 잠금을 요청할 때 경쟁하는 잠금 상태를 의미하며 스레드는 이 상태로 진입하고 실행 상태로 돌아갑니다. 잠금이 성공적으로 획득되면 대기 차단은 다른 스레드의 알림을 기다리는 상태를 의미합니다. 스레드가 조건부 잠금을 획득한 후 "wait"를 호출하면 다른 스레드가 알림을 보내면 이 상태가 됩니다. 스레드는 동기 차단 상태에 들어가 다시 조건부 잠금을 위해 경쟁합니다.
다른 차단은 time.sleep(), anotherthread.join()을 호출하거나 IO를 기다릴 때 차단되는 것을 의미합니다. 스레드는 획득한 잠금을 해제하지 않습니다.
Python은 스레드를 사용하는 두 가지 방법을 제공합니다. 하나는 함수형이고 다른 하나는 클래스 패키징입니다.
* 스레드
* 스레딩
1. 스레드:
>>> import thread >>> dir(thread) ['LockType', '__doc__', '__name__', '__package__', '_count', '_local', 'allocate', 'allocate_lock', 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']
2. Threading:
>>> import threading >>> dir(threading) ['BoundedSemaphore', 'Condition', 'Event', 'Lock', 'RLock', 'Semaphore', 'Thread', 'ThreadError', 'Timer', '_BoundedSemaphore', '_Condition', '_DummyThread', '_Event', '_MainThread', '_RLock', '_Semaphore', '_Timer', '_VERBOSE', '_Verbose', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_active', '_active_limbo_lock', '_after_fork', '_allocate_lock', '_counter', '_enumerate', '_format_exc', '_get_ident', '_limbo', '_newname', '_pickSomeNonDaemonThread', '_profile_hook', '_shutdown', '_sleep', '_start_new_thread', '_sys', '_test', '_time', '_trace_hook', 'activeCount', 'active_count', 'currentThread', 'current_thread', 'deque', 'enumerate', 'local', 'setprofile', 'settrace', 'stack_size', 'warnings']
>>> dir(threading.Thread) ['_Thread__bootstrap', '_Thread__bootstrap_inner', '_Thread__delete', '_Thread__exc_clear', '_Thread__exc_info', '_Thread__initialized', '_Thread__stop', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_block', '_note', '_reset_internal_locks', '_set_daemon', '_set_ident', 'daemon', 'getName', 'ident', 'isAlive', 'isDaemon', 'is_alive', 'join', 'name', 'run', 'setDaemon', 'setName', 'start']
threading.currentThread(): 현재 스레드 변수를 반환합니다. .
threading.enumerate(): 실행 중인 스레드가 포함된 목록을 반환합니다. 실행은 시작 전과 종료 후 스레드를 제외하고 시작 후 종료 전 스레드를 나타냅니다.
threading.activeCount(): 실행 중인 스레드 수를 반환하며, 이는 len(threading.enumerate())과 동일한 결과를 갖습니다.
threading.Thread 메서드를 상속하고 run 메서드를 재정의합니다.
threading.Thread 클래스의 초기화 함수 프로토타입: def __init__(self, group=None, target=None, name=None, args=(), kwargs={})
매개변수 그룹은 예약되어 있습니다. 향후 확장을 위해
매개변수 대상은 스레드가 시작된 후 실행되는 호출 가능한 개체(활동 [활동]이라고도 함)입니다.
매개변수 이름은 스레드의 이름입니다. 기본값은 "Thread-N"입니다. 여기서 N은 숫자입니다.
매개변수 args와 kwargs는 각각 target 호출 시 매개변수 목록과 키워드 매개변수를 나타냅니다.
join() 메소드를 사용하면 이 메소드를 호출하는 스레드는 Thread 객체가 완료될 때까지 기다렸다가 실행을 재개합니다.
Thread.join을 호출하면 호출된 스레드의 실행이 완료되거나 시간 초과될 때까지 호출 스레드가 차단됩니다. 매개변수 timeout은 시간 초과 시간을 나타내는 숫자 유형입니다. 이 매개변수가 제공되지 않으면 호출 스레드는 호출된 스레드가 끝날 때까지 차단됩니다.
threading.Lock 개체: 뮤텍스, acquire() 및 release() 메서드 사용
RLock을 사용하면 동일한 스레드에서 여러 번 획득할 수 있습니다. 하지만 Lock은 이를 허용하지 않습니다. 참고: RLock을 사용하는 경우 획득과 해제는 쌍으로 나타나야 합니다. 즉, 획득이 n번 호출되고 해제가 n번 호출되어야 점유된 잠금을 실제로 해제할 수 있습니다.
threading.Condition 개체: 조건 변수. 이 개체가 생성되면 Lock 개체가 포함됩니다(조건 변수는 항상 뮤텍스와 함께 사용되기 때문). 잠재적인 Lock 객체를 제어하기 위해 Condition 객체에서 acquire() 및 release() 메서드를 호출할 수 있습니다.
Condition.wait([timeout]): 대기 메서드는 점유된 내부 메모리를 해제하고 스레드는 알림을 받은 후 깨어나거나 타임아웃될 때까지 일시 중지됩니다(타임아웃이 발생한 경우). 매개 변수는 단어로 제공됩니다). 스레드가 깨어나 스레드를 다시 점유하면 프로그램은 계속 실행됩니다.
Condition.notify(): 일시 중단된 스레드를 깨웁니다(일시 중단된 스레드가 있는 경우). 참고: inform() 메소드는 점유된 메모리를 해제하지 않습니다.
Condition.notifyAll() 일시 중단된 스레드를 모두 깨웁니다(일시 중단된 스레드가 있는 경우). 참고: 이 방법은 점유된 메모리를 해제하지 않습니다.