Using the threading Module in Python


The threading module in Python is a powerful tool for implementing multithreading. It allows you to run multiple threads simultaneously, making it useful for performing tasks like I/O operations, background tasks, and improving program responsiveness. This article explores how to use the threading module with examples.

Introduction to the threading Module

The threading module provides several features to work with threads, including creating threads, managing thread execution, and synchronizing threads. Common methods and classes in the threading module include:

  • Thread: Used to create and manage threads.
  • start(): Starts a thread’s execution.
  • join(): Waits for a thread to finish execution.
  • current_thread(): Returns the currently executing thread object.
  • active_count(): Returns the number of currently active threads.

Example 1: Creating and Starting Threads

In this example, we create and run two threads using the Thread class.

    import threading
    import time

    def print_numbers():
        for i in range(5):
            print(f"Number: {i}")
            time.sleep(1)

    def print_letters():
        for letter in "ABCDE":
            print(f"Letter: {letter}")
            time.sleep(1)

    thread1 = threading.Thread(target=print_numbers)
    thread2 = threading.Thread(target=print_letters)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

    print("Threads have completed execution")
        

Output:

    Number: 0
    Letter: A
    Number: 1
    Letter: B
    ...
    Threads have completed execution
        

Example 2: Using the current_thread() Method

This example demonstrates how to use the current_thread() method to get information about the currently executing thread.

    import threading

    def display_thread_info():
        print(f"Current Thread: {threading.current_thread().name}")

    thread1 = threading.Thread(target=display_thread_info, name="Thread-1")
    thread2 = threading.Thread(target=display_thread_info, name="Thread-2")

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()
        

Output:

    Current Thread: Thread-1
    Current Thread: Thread-2
        

Example 3: Synchronizing Threads with Lock

When multiple threads access shared resources, synchronization is essential to avoid conflicts. The Lock class is used to synchronize threads.

    import threading
    import time

    counter = 0
    lock = threading.Lock()

    def increment_counter():
        global counter
        with lock:
            temp = counter
            time.sleep(0.1)  # Simulate some work
            counter = temp + 1
            print(f"Counter: {counter}")

    threads = []
    for _ in range(5):
        thread = threading.Thread(target=increment_counter)
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    print(f"Final Counter Value: {counter}")
        

Output:

    Counter: 1
    Counter: 2
    Counter: 3
    Counter: 4
    Counter: 5
    Final Counter Value: 5
        

Example 4: Daemon Threads

Daemon threads are background threads that automatically terminate when the main program exits. Use the daemon property to set a thread as a daemon.

    import threading
    import time

    def background_task():
        while True:
            print("Daemon thread running")
            time.sleep(2)

    daemon_thread = threading.Thread(target=background_task, daemon=True)
    daemon_thread.start()

    time.sleep(5)
    print("Main program ends")
        

Output:

    Daemon thread running
    Daemon thread running
    Daemon thread running
    Main program ends
        

Note: The daemon thread stops automatically when the main program ends.

Conclusion

The threading module in Python provides a simple yet powerful way to implement multithreading. By using classes like Thread, Lock, and methods like current_thread() and active_count(), you can efficiently manage concurrent tasks in your programs. However, be mindful of thread safety and use synchronization mechanisms like locks when working with shared resources.





Advertisement