Python 疑難點一: GIL 和 深拷貝/淺拷貝

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



      


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章