溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python支持多線程嗎

發(fā)布時間:2020-09-24 14:54:54 來源:億速云 閱讀:209 作者:Leah 欄目:編程語言

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è)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(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)容。

AI