Python 的并發(fā)是其最大的優(yōu)勢之一,可以讓我們在同一時間處理多個任務(wù),提高程序的效率。然而,并發(fā)編程中也存在一些坑,其中一個最常見的問題就是卡死。
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()
在上面的代碼中,我們使用多線程來執(zhí)行一個耗時的任務(wù),預(yù)計每個線程都需要10秒鐘的時間。但是,當(dāng)我們運(yùn)行這段代碼時,會發(fā)現(xiàn)程序會卡住,沒有任何輸出。
這是因?yàn)?Python 的全局解釋器鎖(GIL)在多線程執(zhí)行時只允許一個線程執(zhí)行 Python 代碼。即使我們使用多線程,也只能有一個線程執(zhí)行計算密集型的任務(wù)。
解決這個問題的方法是使用多進(jìn)程而不是多線程。多進(jìn)程是可以利用多核處理器并行執(zhí)行多個任務(wù)的。修改上面的代碼如下:
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 模塊,就可以避免卡死問題。