您好,登錄后才能下訂單哦!
python支持多線程嗎?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
多任務(wù)可以由多進(jìn)程完成,也可以由一個進(jìn)程內(nèi)的多線程完成。
進(jìn)程是由若干線程組成的,一個進(jìn)程至少有一個線程。
由于線程是操作系統(tǒng)直接支持的執(zhí)行單元,因此,高級語言通常都內(nèi)置多線程的支持,Python也不例外,并且,Python的線程是真正的Posix Thread,而不是模擬出來的線程。
多核CPU
如果你不幸擁有一個多核CPU,你肯定在想,多核應(yīng)該可以同時執(zhí)行多個線程。
如果寫一個死循環(huán)的話,會出現(xiàn)什么情況呢?
打開Mac OS X的Activity Monitor,或者Windows的Task Manager,都可以監(jiān)控某個進(jìn)程的CPU使用率。
我們可以監(jiān)控到一個死循環(huán)線程會100%占用一個CPU。
如果有兩個死循環(huán)線程,在多核CPU中,可以監(jiān)控到會占用200%的CPU,也就是占用兩個CPU核心。
要想把N核CPU的核心全部跑滿,就必須啟動N個死循環(huán)線程。
試試用Python寫個死循環(huán):
import threading, multiprocessingdef loop(): x = 0 while True: x = x ^ 1for i in range(multiprocessing.cpu_count()): t = threading.Thread(target=loop) t.start()
啟動與CPU核心數(shù)量相同的N個線程,在4核CPU上可以監(jiān)控到CPU占用率僅有102%,也就是僅使用了一核。
但是用C、C++或Java來改寫相同的死循環(huán),直接可以把全部核心跑滿,4核就跑到400%,8核就跑到800%,為什么Python不行呢?
因?yàn)镻ython的線程雖然是真正的線程,但解釋器執(zhí)行代碼時,有一個GIL鎖:Global Interpreter Lock,任何Python線程執(zhí)行前,必須先獲得GIL鎖,然后,每執(zhí)行100條字節(jié)碼,解釋器就自動釋放GIL鎖,讓別的線程有機(jī)會執(zhí)行。
這個GIL全局鎖實(shí)際上把所有線程的執(zhí)行代碼都給上了鎖,所以,多線程在Python中只能交替執(zhí)行,即使100個線程跑在100核CPU上,也只能用到1個核。
GIL是Python解釋器設(shè)計的歷史遺留問題,通常我們用的解釋器是官方實(shí)現(xiàn)的CPython,要真正利用多核,除非重寫一個不帶GIL的解釋器。
所以,在Python中,可以使用多線程,但不要指望能有效利用多核。如果一定要通過多線程利用多核,那只能通過C擴(kuò)展來實(shí)現(xiàn),不過這樣就失去了Python簡單易用的特點(diǎn)。
不過,也不用過于擔(dān)心,Python雖然不能利用多線程實(shí)現(xiàn)多核任務(wù),但可以通過多進(jìn)程實(shí)現(xiàn)多核任務(wù)。多個Python進(jìn)程有各自獨(dú)立的GIL鎖,互不影響。
看完上述內(nèi)容,你們掌握python支持多線程嗎的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。