來一道GIL面試題 描述python GIL的概念,以及他對python多線程的影響,編寫一個多線程抓取網頁的程式,並闡明多線程抓取程式是否比單線程有所提升,並解釋原因。 參考答案: 1.python語言和GIL沒有關係,僅僅是由於歷史原因在CPython虛擬機(解釋器),難以移除GIL 2.GIL ...
來一道GIL面試題
描述python GIL的概念,以及他對python多線程的影響,編寫一個多線程抓取網頁的程式,並闡明多線程抓取程式是否比單線程有所提升,並解釋原因。
參考答案:
1.python語言和GIL沒有關係,僅僅是由於歷史原因在CPython虛擬機(解釋器),難以移除GIL
2.GIL:全局解釋器鎖,每個線程在執行的過程都需要先獲取GIL,保證同一時刻只有一個線程可以執行代碼
3.線程是放GIL的情況:在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執行完畢後必須重新獲取GIL
4.python使用多進程是可以利用多核的資源的
5.多線程爬取比單線程有提升,因為遇到IO阻塞會自動釋放GIL鎖
為python喊冤
GIL全局解釋鎖與python沒有一點的關係,只是跟cPython解釋有關,那什麼由解釋器呢?我們都知道,機器只認得0,1這樣組成的數字,而我們寫的代碼卻不是,那麼我們就就需要將我們寫的代碼轉化為機器認識的0,1,那麼解釋器就是幹了這麼一件事。然而解釋可以用c,java,c#等其他語言寫,但python官網推薦是c寫的解釋器,人們就叫他cpython.java也寫過一個解釋器叫Jpython.而cpython解釋器中有GIL,Jpython中沒有。
GIL特點
1.保證同一時刻只有一個線程在做,不管是主線程,還是子線程。記住,只是對線程,
2.他會在合適的時間轉到其他線程上執行,比如IO阻塞的時候,他不會等待,而是執行其他的線程
3.計算密集型程式(用進程)能比較直觀的體現出他的缺點,IO密集型程式(線程,協程)體現的就不是那麼的明顯
python之父聲明概要
想要移除GIL不是一件容易的事情,要想使用多任務,多使用進程唄
解決GIL的方法
1.換解釋器
2.用其他的語言來實現該部分的功能,python是一種膠水性的語言,其可以調用其他語言寫的程式