简体   繁体   English

在 Python 中使用两个单独的线程打印偶数和奇数

[英]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 ).我编写了下面的代码来使用 Python 中的 2 个单独线程打印偶数和奇数,但此代码不起作用(程序未显示任何 output 并且期望按顺序打印 0-10 的数字)。 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()

Using multiprocessing makes the code a little cleaner.使用多处理使代码更简洁。 You also want to avoid global variables if you don't have to.如果不需要,您还希望避免使用全局变量。

from multiprocessing import Process

def print_even(limit, exit_prog, number):
    while not exit_prog and number <= limit:
        if(number % 2 == 0):
            print(number)
        number = number + 1

def print_odd(limit, exit_prog, number):
    while not exit_prog and number <= limit:
        if(number % 2 == 1):
            print(number)
        number = number + 1

if __name__ == "__main__":

    limit = 10
    exit_prog = False
    number = 0

    t1 = Process(target=print_even, args=(limit, exit_prog, number))
    t1.start()
    t2 = Process(target=print_odd, args=(limit, exit_prog, number))
    t2.start()

    t1.join()
    t2.join()

You simply forgot to wait() for even_available / odd_available inside the while loop:您只是忘记了 while 循环中的even_available / odd_availablewait()

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM