Python 的并發是其最大的優勢之一,可以讓我們在同一時間處理多個任務,提高程序的效率。然而,并發編程中也存在一些坑,其中一個最常見的問題就是卡死。
import threading import time def task(): print('start') time.sleep(10) print('end') if __name__ == '__main__': for i in range(5): thread = threading.Thread(target=task) thread.start()
在上面的代碼中,我們使用多線程來執行一個耗時的任務,預計每個線程都需要10秒鐘的時間。但是,當我們運行這段代碼時,會發現程序會卡住,沒有任何輸出。
這是因為 Python 的全局解釋器鎖(GIL)在多線程執行時只允許一個線程執行 Python 代碼。即使我們使用多線程,也只能有一個線程執行計算密集型的任務。
解決這個問題的方法是使用多進程而不是多線程。多進程是可以利用多核處理器并行執行多個任務的。修改上面的代碼如下:
import multiprocessing import time def task(): print('start') time.sleep(10) print('end') if __name__ == '__main__': for i in range(5): process = multiprocessing.Process(target=task) process.start()
我們只需要將 threading 模塊替換為 multiprocessing 模塊,就可以避免卡死問題。