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陳馳的回答 - 知乎 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM