Python 中的多线程

Vaibhav Vaibhav 2022年5月17日
Python 中的多线程

多线程是指在单个进程中同时运行多个线程的技术。并发执行旨在利用计算机系统的全部潜力,并像往常一样更快地执行任务。

与进程相比,线程非常轻量级并且内存占用少。由于它们非常轻量级,因此创建新线程是一个快速的过程。运行线程需要更少的系统资源(例如内存)来运行。

由于线程是进程的一部分,它们与父进程或创建它们的进程共享内存空间。多线程可能看起来太令人印象深刻了,但并不是所有的闪光都是金子。使用线程时必须小心,因为遇到死锁和竞争条件是很常见的。不幸的是,由于 Python 中的 GIL 或 Global Interpreter Lock,Python 创建的线程提供了交错,并按顺序而不是并行执行。

人们可以在其他编程语言(如 Java)中发现真正的线程并行性。如果仍然需要使用 Python 从多个 CPU 内核中受益,他们应该考虑使用多处理(并行执行各种进程的技术)。

尽管如此,我们仍然可以在某种程度上在 Python 中执行多线程。在本文中,我们将学习如何使用 Python 执行多线程。

Python 中的多线程

我们可以使用 Python 的 threading 库在 Python 中执行多线程。它是官方 Python 预装的内置模块,旨在在 Python 中提供基于线程的并行性。要了解有关此模块及其提供的更多信息,请参阅官方文档此处

现在,让我们了解如何使用这个库来执行多线程。请参阅以下 Python 代码。

import threading

class MyThread(threading.Thread):
    def __init__(self, low, high):
        super(MyThread, self).__init__()
        self.low = low
        self.high = high
        self.total = 0

    def run(self):
        for x in range(self.low, self.high):
            self.total += x
             
    def __str__(self):
        return f"Low: {self.low} | High: {self.high}"


thread_one = MyThread(0, 500000)
thread_two = MyThread(5000000, 10000000)
thread_one.start()
thread_two.start()
thread_one.join()
thread_two.join()
result = thread_one.total + thread_two.total
print("Result:", result)

输出:

Result: 37624997250000

threading 模块提供了一个 Thread 类,表示在单独线程上执行的操作。动作可以是任何东西,数学计算,对 API 端点的 POST 或 GET 请求,从预先训练的机器学习模型中检索一些输出,一些繁重的分析等。

必须创建一个继承 Thread 类的新类,就像上面 Python 代码中的 MyThread 类一样。接下来,Thread 类有一个 run() 方法,该方法必须被覆盖。此函数包含线程在激活时将执行的实际任务或计算。

正如我们所见,我们已经覆盖了上述 Python 代码中的 run() 函数。上面的 run() 函数基本上在类属性 lowhigh 定义的范围内循环。它将范围内的所有整数添加到另一个类属性 total

现在我们已经完成了对类的简要描述,让我们了解程序是如何工作的。请参阅前面的步骤。

  1. 产生或创建两个线程,即 thread_onethread_two
  2. 接下来,调用两个线程的 start() 方法。start() 方法为我们执行 run() 方法。
  3. 接下来,为两个线程调用 join() 方法。此方法确保两个线程在终止之前相互等待。假设第一个线程在第二个线程前 5 秒完成了它的任务。如果我们让程序继续执行,我们会遇到奇怪的错误,因为第二个线程仍然没有完成它的任务。join() 方法确保没有线程终止,除非所有其他线程都完成了它们的任务。
  4. 最后,将两个线程的结果相加,并将结果打印到控制台。

请注意,必须让一个被召唤的线程等待其他线程完成它们的执行;否则,可能会遇到错误的结果和错误。

要了解有关 Thread 类的更多信息,请在此处参阅官方文档。

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub