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()
函数基本上在类属性 low
和 high
定义的范围内循环。它将范围内的所有整数添加到另一个类属性 total
。
现在我们已经完成了对类的简要描述,让我们了解程序是如何工作的。请参阅前面的步骤。
- 产生或创建两个线程,即
thread_one
和thread_two
。 - 接下来,调用两个线程的
start()
方法。start()
方法为我们执行run()
方法。 - 接下来,为两个线程调用
join()
方法。此方法确保两个线程在终止之前相互等待。假设第一个线程在第二个线程前5
秒完成了它的任务。如果我们让程序继续执行,我们会遇到奇怪的错误,因为第二个线程仍然没有完成它的任务。join()
方法确保没有线程终止,除非所有其他线程都完成了它们的任务。 - 最后,将两个线程的结果相加,并将结果打印到控制台。
请注意,必须让一个被召唤的线程等待其他线程完成它们的执行;否则,可能会遇到错误的结果和错误。
要了解有关 Thread
类的更多信息,请在此处参阅官方文档。