Python에서 `start()`를 호출하기 전에 내 스레드가 실행되는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-11 04:00:03
원래의
386명이 탐색했습니다.

Why Does My Thread Run Before Calling `start()` in Python?

시작 호출 없이 스레드 조기 실행

Python에서는 스레드 개체를 생성해도 자동으로 실행이 시작되지 않습니다. 그러나 start() 메서드가 호출되기 전에도 스레드가 실행을 시작한 것처럼 보일 수 있습니다. 이 동작은 부적절한 스레드 생성으로 인해 발생할 수 있으며 아래에 설명되어 있습니다.

다음 코드 조각을 고려하세요.

t1 = threading.Thread(target=self.read)
print("something")
t2 = threading.Thread(target=self.runChecks(), args=(self,))
로그인 후 복사

이 예에서 self.read 함수는 무기한 실행되도록 되어 있습니다. 프로그램이 후속 인쇄 문에 도달하는 것을 방지합니다. 그러나 프로그램은 print 문을 완전히 건너뜁니다. 일반적으로 스레드에서 start()를 호출하면 실행이 시작되고 선형적으로 진행되므로 이 동작은 비정상적인 것으로 보입니다.

이 문제에 대한 설명은 스레드를 생성하는 데 사용되는 구문에 있습니다. 첫 번째 줄에서 self.read 뒤의 괄호는 효과적으로 함수를 호출하고 반환 값을 스레드의 대상으로 할당합니다. 이는 self.read가 실제로 새로 생성된 스레드가 아닌 메인 스레드에서 실행되고 있음을 의미합니다.

이 문제를 해결하려면 대상 인수에서 괄호를 제거하기만 하면 됩니다.

t1 = threading.Thread(target=self.read)
t1.start()
print("something")
로그인 후 복사

이렇게 하면 self.read는 스레드에 의해 실행될 대상 함수가 되며 t1.start()가 호출된 후에만 실행을 시작합니다.

인수가 필요한 대상의 경우 threading.Thread의 args 또는 kwargs 매개 변수를 사용하세요. 또는 람다 표현식을 사용하세요. 예를 들면 다음과 같습니다.

thread = threading.Thread(target=lambda: f(a, b, x=c))
로그인 후 복사

이 구문은 함수와 해당 인수를 스레드에 전달하여 적절한 실행을 보장합니다.

람다 함수는 정의할 때가 아니라 사용될 때 인수를 평가한다는 점을 기억하세요. 즉, 스레드를 예약하기 전에 변수를 재정의하면 예상치 못한 결과가 발생할 수 있습니다.

위 내용은 Python에서 `start()`를 호출하기 전에 내 스레드가 실행되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿