1. 程式人生 > 實用技巧 >Python的多執行緒有什麼特點?

Python的多執行緒有什麼特點?

面試頭條的時候:Python的多執行緒有什麼特點?當時直接答不會。。

結論:Python的多執行緒是假的,不能有效的利用多核。

先看幾個例子,

1. python的多執行緒

#coding=utf-8
from multiprocessing import Pool
from threading import Thread

from multiprocessing import Process


def loop():
    while True:
        pass

if __name__ == '__main__':

    for i in range(3):
        t 
= Thread(target=loop) t.start() while True: pass

我的電腦是4核,所以我開了4個執行緒,看一下CPU資源佔有率:

我們發現CPU利用率並沒有佔滿,大致相當於單核水平。而如果我們變成程序呢?

2. python的多程序
#coding=utf-8
from multiprocessing import Pool
from threading import Thread

from multiprocessing import Process


def loop():
    while True:
        
pass if __name__ == '__main__': for i in range(3): t = Process(target=loop) t.start() while True: pass

結果直接飆到了100%,說明程序是可以利用多核的!

我們再用Java/C重寫一下,開啟多執行緒。

3. java的多執行緒

package com.darrenchan.thread;

public class TestThread {
    public static void main(String[] args) {
        
for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { while (true) { } } }).start(); } while(true){ } } }

由此可見,Java中的多執行緒是可以利用多核的,這是真正的多執行緒!而Python中的多執行緒只能利用單核,這是假的多執行緒!

為什麼會這樣?

GIL鎖,然後,每執行100條位元組碼,直譯器就自動釋放GIL鎖,讓別的執行緒有機會執行。這個GIL全域性鎖實際上把所有執行緒的執行程式碼都給上了鎖,所以,多執行緒在Python中只能交替執行,即使100個執行緒跑在100核CPU上,也只能用到1個核。

GIL是Python直譯器設計的歷史遺留問題,通常我們用的直譯器是官方實現的CPython,要真正利用多核,除非重寫一個不帶GIL的直譯器。

怎麼解決呢?

如果一定要通過多執行緒利用多核,那隻能通過C擴充套件來實現,例如Numpy底層就是C++實現的。不過這樣就失去了Python簡單易用的特點

另一方面,Python雖然不能利用多執行緒實現多核任務,但可以通過多程序實現多核任務。多個Python程序有各自獨立的GIL鎖,互不影響。

參考連結:

1.https://www.liaoxuefeng.com/wiki/1016959663602400/1017629247922688

2.為什麼有人說 Python 的多執行緒是雞肋呢? - DarrenChan陳馳的回答 - 知乎