So the timeout param, for a thread, should stop the thread after timeout seconds (if it hasn't terminated yet).
In my software I'm trying to replace a Queue.Queue.join() (it contains an item for every thread: each thread will run Queue.Queue.task_done()) that could stop the software if a thread doesn't terminate. So if a thread, among other 50, doesn't terminate then it is all freezed.
I want that every thread stops in 5 seconds, for example. So i will start each thread with timeout of 5 seconds. Is it correct?
CODE
import threading
import time
def tt(name, num):
while True:
num += 0.5
print 'thread ' + str(name) + ' at time ' + str(num)
time.sleep(0.5)
for i in range(3):
t=threading.Thread(target=tt, args=(i, 0))
t.setDaemon(True)
t.start()
t.join(timeout=1)
print 'end'
RESULT
It is not properly working.. every thread should stop after 1 second. Thread 0 stops after 3 secs, thread 1 after 2 secs.
thread 0 at time 0.5
thread 0 at time 1.0
thread 1 at time 0.5
thread 0 at time 1.5
thread 0 at time 2.0
thread 1 at time 1.0
thread 2 at time 0.5
thread 0 at time 2.5
thread 1 at time 1.5
thread 2 at time 1.0thread 1 at time 2.0
thread 0 at time 3.0
end
Both wait() and join() are a non-static method. Both wait() and join() are overloaded in Java. wait() and join() which without timeout as well as accepts a timeout parameter.
Join is a synchronization method that blocks the calling thread (that is, the thread that calls the method) until the thread whose Join method is called has completed. Use this method to ensure that a thread has been terminated. The caller will block indefinitely if the thread does not terminate.
A Python thread is just a regular OS thread. If you don't join it, it still keeps running concurrently with the current thread. It will eventually die, when the target function completes or raises an exception.
It checks isAlive, so it will just return. Some people have a misconception that join somehow causes threads to be joined together and mixed or something. In fact, all it does is wait for the other thread to terminate if it hasn't already.
You're misunderstanding what timeout
does. It just tells join
how long to wait for the thread to stop. If the thread is still running after the timeout expires, the join
call ends, but the thread keeps running.
From the docs:
When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof). As join() always returns None, you must call isAlive() after join() to decide whether a timeout happened – if the thread is still alive, the join() call timed out.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With