首页 > 编程知识 正文

Python两个线程交替打印1到100

时间:2023-11-22 11:55:10 阅读:291753 作者:YQDW

这篇文章的主题是关于Python多线程的应用。我们将会通过实际的代码,学习如何使用Python两个线程交替打印1到100。

一、创建线程

在Python中,我们可以使用Thread模块创建线程。下面是一个简单的例子:

import threading

def print_number():
    for i in range(1, 101):
        print(i)

t = threading.Thread(target=print_number)
t.start()

通过这段代码,我们可以创建一个名为t的线程,将print_number函数作为线程的目标函数,并使用start()方法启动该线程。该函数将会打印1到100的数字。

二、实现两个线程交替打印

下面,我们需要使用两个线程来交替打印1到100。我们可以使用Condition对象实现这个目标。

import threading

class PrintNumber:
    def __init__(self):
        self.condition = threading.Condition()
        self.turn = 1

    def print_odd(self):
        with self.condition:
            for i in range(1, 101, 2):
                while self.turn != 1:
                    self.condition.wait()
                print(i)
                self.turn = 2
                self.condition.notify_all()

    def print_even(self):
        with self.condition:
            for i in range(2, 101, 2):
                while self.turn != 2:
                    self.condition.wait()
                print(i)
                self.turn = 1
                self.condition.notify_all()

num = PrintNumber()

odd_thread = threading.Thread(target=num.print_odd)
even_thread = threading.Thread(target=num.print_even)

odd_thread.start()
even_thread.start()

在这个例子中,我们创建了一个名为PrintNumber的类,该类包含两个方法:print_odd和print_even。这两个方法在执行时,会分别打印奇数和偶数。Condition(条件变量)对象是用来帮助线程进行交替执行的。只有当线程的turn变量与执行条件相符时,线程才能继续执行。这个turn变量是用来记录应该打印哪个数。当打印奇数时,turn等于1,当打印偶数时,turn等于2。notify_all()方法负责唤醒所有正在等待的线程。

三、避免死锁

在上面的例子中,如果我们在等待条件变量时没有使用信号量,就可能会导致死锁的发生。这是因为线程会一直等待条件变量被唤醒,但是它却没有被唤醒。为了避免死锁,我们需要在等待条件变量时使用超时机制。

import threading
import time

class PrintNumber:
    def __init__(self):
        self.condition = threading.Condition()
        self.turn = 1

    def print_odd(self):
        with self.condition:
            for i in range(1, 101, 2):
                while self.turn != 1:
                    self.condition.wait(timeout=0.1)
                print(i)
                self.turn = 2
                self.condition.notify_all()

    def print_even(self):
        with self.condition:
            for i in range(2, 101, 2):
                while self.turn != 2:
                    self.condition.wait(timeout=0.1)
                print(i)
                self.turn = 1
                self.condition.notify_all()

num = PrintNumber()

odd_thread = threading.Thread(target=num.print_odd)
even_thread = threading.Thread(target=num.print_even)

odd_thread.start()
even_thread.start()

在上面的代码中,我们使用wait(timeout=0.1)方法来等待条件变量,在0.1秒后如果条件仍然未满足,就会导致超时,从而避免死锁。

四、结语

通过这篇文章,我们了解了Python多线程的应用,学习了如何使用两个线程交替打印1到100。我们还了解了如何使用Condition对象来帮助线程交替执行,并避免死锁。在实际编程中,我们需要根据实际情况来决定是否需要使用多线程,以及如何避免多线程导致的问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。