python基礎-------進程線程(二)

來源:互聯網
上載者:User

標籤:函數   主線程   ext   api   引入   機制   set   互斥   tar   

  Python中的進程線程(二)

一、python中的“鎖”

1.GIL鎖(全域解釋鎖)

含義:

Python中的線程是作業系統的原生線程,Python虛擬機器使用一個全域解譯器鎖(Global Interpreter Lock)來互斥線程對Python虛擬機器的使用。為了支援多線程機制,一個基本的要求就是需要實現不同線程對共用資源訪問的互斥,所以引入了GIL。
GIL:在一個線程擁有瞭解釋器的訪問權之後,其他的所有線程都必須等待它釋放解譯器的訪問權,即使這些線程的下一條指令並不會互相影響。
在調用任何Python C API之前,要先獲得GIL。
GIL缺點:多處理器退化為單一處理器;優點:避免大量的加鎖解鎖操作。

1.1GIL的影響

無論你啟多少個線程,你有多少個cpu, Python在執行一個進程的時候會淡定的在同一時刻只允許一個線程運行。
所以,python是無法利用多核CPU實現多線程的。
這樣,python對於計算密集型的任務開多線程的效率甚至不如串列(沒有大量切換),但是,對於IO密集型的任務效率還是有顯著提升的。

IO密集型案例:

import threading
import time
def foo(n):


  time.sleep(n)
  print("foo....%s" % n)

  print(threading.activeCount())

def bar(n):

  time.sleep(n)
  print("bar......%s" % n)

s=time.time()
t1=threading.Thread(target=foo,args=(2,))
#t1.setDaemon(True)
t1.start()

t2=threading.Thread(target=bar,args=(5,))
#t2.setDaemon(True)
t2.start()

t1.join() # 阻塞主線程
t2.join()

print("++++++",threading.activeCount())
print("ending!")
print("cost time:",time.time()-s)

計算密集型案例:

import threading

import time

def foo(n):
  ret=0
  for i in range(n):
    ret+=i
  print(ret)


def bar(n):#計算密集型的任務指的是線程中存在大量的計算任務我們以階乘和累加為例,通過傳統的串列執行函數和計算。
  ret=1
  for i in range(1,n):
    ret*=i
  print(ret)

s=time.time()
t1=threading.Thread(target=foo,args=(100000000,))
t1.start()
t2=threading.Thread(target=bar,args=(100000,))
t2.start()
t1.join()
t2.join()
print("cost time:",time.time()-s)

python基礎-------進程線程(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.