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

问题描述 投票:0回答:2

我在Python中写了下面的代码,用2个独立的线程来打印偶数和奇数,但是这段代码没有工作(程序不显示任何输出,期望按顺序打印0-10的数字。). 如果能帮助我们调试好这个问题,我们将非常感激。下面是代码。

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()
python python-multithreading
2个回答
0
投票

你只是忘记了 wait() 对于 even_availableodd_available 内的while循环。

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

0
投票

使用多进程可以让代码更干净。如果没有必要,你也要避免使用全局变量。

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()
© www.soinside.com 2019 - 2024. All rights reserved.