Search code examples
pythonpython-multithreading

Printing even and odd numbers using two separate threads in Python


I have written a below code to print even and odd numbers using 2 separate threads in Python, but this code isn't working (Program is not showing any output and expectation is to print numbers from 0-10 in sequence). Any help in getting this debugged would be highly appreciated. Below is the code:

from threading import Thread
from threading import Event


even_available = Event()
odd_available = Event()

def print_even():
    global limit
    global exit_prog
    global number

    while not exit_prog and number <= limit:
        print(number)
        number = number + 1
        even_available.clear()

        odd_available.set()

def print_odd():
    global limit
    global exit_prog
    global number

    odd_available.wait()
    while not exit_prog and number <= limit:
        print(number)
        number = number+1
        odd_available.clear()
        even_available.set()

if __name__ == "__main__":

    limit = 10
    exit_prog = False
    number = 0

    t1 = Thread(target=print_even)
    t2 = Thread(target=print_odd)

    even_available.set()

    t1.start()
    t2.start()

    t1.join()
    t2.join()

Solution

  • You simply forgot to wait() for even_available/odd_available inside the while loop:

    from threading import Thread
    from threading import Event
    
    even_available = Event()
    odd_available = Event()
    
    def print_even():
        global limit
        global exit_prog
        global number
    
        while not exit_prog and number < limit:
            even_available.wait()
            print('E', number)
            number = number + 1
            even_available.clear()
            odd_available.set()
    
    def print_odd():
        global limit
        global exit_prog
        global number
    
        while not exit_prog and number < limit:
            odd_available.wait()
            print('O', number)
            number = number + 1
            odd_available.clear()
            even_available.set()
    
    if __name__ == "__main__":
    
        limit = 10
        exit_prog = False
        number = 0
    
        t1 = Thread(target=print_even)
        t2 = Thread(target=print_odd)
    
        even_available.set()
    
        t1.start()
        t2.start()
    
        t1.join()
        t2.join()
    

    Prints:

    E 0
    O 1
    E 2
    O 3
    E 4
    O 5
    E 6
    O 7
    E 8
    O 9
    E 10