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
類的更多資訊,請在此處參閱官方文件。