1. 程式人生 > >python基礎-------進程線程(二)

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

lob size 擁有 利用 oba tar 優點 port pre

  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基礎-------進程線程(二)