시작 호출 없이 스레드 조기 실행
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!