GIL (全局解釋器鎖)
一般面試題:
描述Python GIL的概念, 以及它對python多線程的影響
參考答案:
1. GIL 跟Python 語言沒有任何關係 , 而僅僅只是跟cpython 解釋器有關, 由於歷史原因,很久之前的cpu 僅僅只供單線程使用,而如今多cpu 多線程 多任務爲主,難以移除GIL;
2.GIL 的意思 就是全局解釋器鎖 ()global interpreter lock) , 每個線程在執行的時候需要先獲取GIL, 保證同一時刻只有一個線程在執行代碼
3. 線程釋放GIL 鎖的情況: 在IO 操作等可能會引起阻塞的system call之前, 可以暫時釋放GIL,但在執行完畢之後,必須重新獲取GIL
4.對於計算密集型用多進程,多IO密集型用多線程
5.Python 使用多進程是可以利用多核CPU資源的 ; 多線程爬蟲比單線程性能有所提高, 因爲遇到IO阻塞的時候會自動釋放GIL鎖
深拷貝 / 淺拷貝
1. 淺拷貝 ----- copy.copy()
淺拷貝是對一個對象的頂層拷貝; 通俗意思就是說 : 只拷貝了引用, 沒有拷貝內容,內容仍然是原引用
2.深拷貝----copy.deepcopy()
深拷貝是對一個對象所有層次的拷貝(遞歸)
3. 拷貝的其他方式
分片表達式 可以賦值一個序列
字典的copy方法可以拷貝一個字典
4.注意點:
[1] 用copy(), deepcopy() 對一個全部都是不可變類型數據進行拷貝,那麼結果相同, 都是引用指向
[2]如果 擁有可變數據,即使元祖是最頂層,deepcopy 依舊是深拷貝 ,copy 還是引用指向
[3] 對可變類型來說, 淺拷貝和深拷貝 都會改變重新拷貝一份數據,但是淺拷貝不會改變列表裏可變類型的元
素的id, 但深拷貝就會改變可變類型的元素id