Thread class and its Object - Python Multithreading
In the threading
module the most popular and the most used call is the Thread
class, which is primarily used to create and run threads. Thread
class provides all the major functionalities required to create and manage a thread.
Thread objects are the objects of the Thread class where each object represents an activity to be performed in a separate thread of control.
There are two ways to create the Thread object and specify the activity to be performed:
- by passing a callable object to the constructor
- or, by overriding the
run()
method in a subclass.
Thread object which is created using constructor or run method can be started by using start()
method. Whenever a Thread object starts a new thread then internally it's run()
method is invoked.
Here is a simple example:
In the example above, we have also used the time
module to make one of the thread sleep.
Basic syntax of the Thread
class constructor is:
Thread(group=None, target=None, name=None, args=(), kwargs={})
We will explain the arguments of the Thread
class constructor in the section below.
How Thread works?
Once we initialize a thread using the Thread
class constructor, we must call its start()
method to start the thread.
When the thread starts, the thread is considered alive and active. When its run()
method terminates, either normally, or due to an unhandled exception then the thread stops being alive or active. The isAlive()
method tests whether the thread is alive or not at any given point of time.
Other threads can call a thread's join()
method to join any thread. This blocks the calling thread until the thread whose join()
method is called is terminated.
For example, in the code above, from the main thread, we call t1.join()
and t2.join()
, hence the main thread will wait for the threads t1
and t2
to terminate and then end.
Every thread has a name associated with it. The name can be passed to the constructor, or we can set or retrieve name by using setname()
and getname()
methods respectively.
A flag daemon thread can be associated with any thread. The significance of this flag is that the entire python program exits when only daemon threads are left. The flag can be set or retrieved by using setDaemon()
method and getDaemon()
method respectively.
The main thread object corresponds to the initial thread of control in the python program. It is not a daemon thread.
Functions and Constructor in the Thread
class
Now that we have seen a basic threading program with threads running, it's time to understand the code along with exploring all the important methods provided by the Thread
class.
Thread
class Constructor
Following is the basic syntax of the Thread
class constructor:
Thread(group=None, target=None, name=None, args=(), kwargs={})
The constructor allows many arguments, some of which are required while some are not. Let's see what they are:
-
group
: Should be None. It is reserved for future extension.
-
target
: This is the callable object or task to be invoked by the run()
method. As you can see in the code example at the top, we have specified the function names thread1 and thread2 as the value for this argument. It's default value is None.
-
name
: This is used to specify the thread name. By default, a unique name is generated following the format Thread-N, where N is a small decimal number.
-
args
: This is the argument tuple for the target invocation. We can provide values in it which can be used in the traget method. It's default value is empty, i.e. ()
-
kwargs
: This is keyword argument dictionary for the target invocation. This defaults to {}.
start()
method
This method is used to start the thread's activity. When we call this method, internally the run()
method is invoked which executes the target function or the callable object.
run()
method
Method representing the thread's activity.
You may override this method in a subclass extending the Thread class of the threading module. The standard run() method invokes the callable object passed to the object's constructor as the target argument with sequential and keyword arguments taken from the args
and kwargs
arguments, respectively.
Here we have a simple example, where we have created a subclass in which we will override the run()
method.
join([timeout])
method
When we call this method for any thread, it blocks the calling thread until the thread whose join()
method is called terminates, either normally or through an unhandled exception.
If you want to provide the timeout
argument, it should be a floating point number.
getName()
method
This method is used to return the thread's name.
setName(name)
method
Used for setting the thread's name. The name is a string used for identification purposes only.
isAlive()
method
This method returns whether the thread is alive or not. A thread is alive from the moment the start()
method returns until its run()
method terminates.
isDaemon()
method
This method is used to get the value of the thread's daemon flag.
setDaemon(daemonic)
method
This method is used to set the thread's daemon flag to the Boolean value daemonic. This must be called before start()
method is called.
The entire Python program exits when no active non-daemon threads are left.