When creating threads in Python, it's crucial to invoke them explicitly using the start() method. However, in situations where the target function is invoked within the thread creation syntax, an intriguing issue arises.
Consider the following code snippet:
t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
Surprisingly, the print statement never executes because self.read runs indefinitely, preventing the program from reaching the next line. This behavior seems counterintuitive, as calling t1.start() should initiate thread execution and allow the program to proceed.
The issue lies in the trailing parentheses after self.read(). In Python, parentheses immediately following a function invoke it, so the following code:
target=self.read()
actually calls self.read and passes its return value as the target argument to Thread. However, Thread expects a function reference, not a return value. To correct the behavior, simply remove the parentheses and explicitly invoke t1.start() after thread creation:
t1 = threading.Thread(target=self.read) t1.start() print("something")
When the target function requires arguments, use the args or kwargs arguments to threading.Thread. Alternatively, employ a lambda function, as shown below:
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
or
thread = threading.Thread(target=lambda: f(a, b, x=c))
Remember, if using a lambda, the function's arguments are evaluated when the lambda is invoked, not when it's defined. This can lead to unexpected results if variables are reassigned before thread scheduling.
The above is the detailed content of Why Does My Thread Execution Anomalous When I Don't Explicitly Invoke Threads in Python?. For more information, please follow other related articles on the PHP Chinese website!