在說怎麼建立執行緒之前,我覺得有必要說明一下gil是什麼,gil的全稱是 global interpreter lock,也就是全域性直譯器鎖。
由於gil的存在,使得每一時刻,只能有乙個執行緒在乙個cpu上執行,也就是說,我們沒辦法利用多核的優勢,因為即使多核,
同一時刻也只能有乙個執行緒在乙個cpu上執行。這也是python被人吐槽慢的原因。
當然了,既然是鎖,那麼就自然會有釋放的時候,gil也不例外。gil會根據執行的位元組碼的行數或者時間片來釋放gil鎖,
在遇到io操作時,也會釋放gil鎖,所以並不是說只要執行緒一拿到鎖,就直到執行完才釋放,我們可以通過下面這個例子來說明。
import threading
total = 0
def add():
global total
for i in range(1000000):
total += 1
def desc():
global total
for i in range(1000000):
total -= 1
if __name__ == '__main__':
thread1 = threading.thread(target=add)
thread2 = threading.thread(target=desc)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(total)
上面這段**的輸出結果並不是0,這不是我們想要的結果,但也說明了執行緒在執行到一半的時候被切換掉了。
如果我們想保證資料的同步的話,我們就必須給其上鎖。
我們可以通過匯入鎖來保證資料的同步,**如下。
import threading
from threading import lock
total = 0
lock = lock()
def add():
global total
global lock
for i in range(1000000):
lock.acquire()
total += 1
lock.release()
def desc():
global total
global lock
for i in range(1000000):
lock.acquire()
total -= 1
lock.release()
if __name__ == '__main__':
thread1 = threading.thread(target=add)
thread2 = threading.thread(target=desc)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(total)
加了鎖之後再執行,會發現結果是0
在python中,建立執行緒需要的模組是threading,如下圖,這是第一種建立方式,args這個引數可以不要,但如果要寫引數的話,必須是乙個可迭代的物件。
import threading
def add(a):
a += 1
if __name__ == '__main__':
thread1 = threading.thread(target=add,args=(0,))
thread1.start()
第二種建立執行緒的方式是通過繼承執行緒類來建立程序。
import threading
class add(threading.thread):
def __init__(self,a):
super().__init__()
self.a = a
def run(self):
for i in range(1000000):
self.a += 1
if __name__ == '__main__':
ad = add(0)
ad.start()
用這種方式建立程序的時候,需要過載run方法。 如何建立執行緒
有兩種方式來建立乙個執行緒 通過擴充套件thread類 通過實現runnable介面。thread類提供建構函式和方法來建立和執行執行緒的操作.thread類擴充套件了object類並實現了runnable介面。public void run 用於為執行緒執行操作。public void sleep...
python中如何建立包 如何建立python的包
包是模組的集合,更適合乙個專案。像很多的第三方知名的模組都是以包的形式存 簡單的包實現 自己做乙個ammd包,功能簡單的只有加減乘除等功能,加減在乙個模組matham裡,乘除位於另乙個模組裡mathmd。下面是matham模組的 def add x,y return x ydef minus x,y...
python動態建立執行緒 在python中建立執行緒
我有乙個指令碼,我想要乙個功能與另乙個同時執行。我看過的示例 import threading def mythread threading.thread doing something.def mythread2 threading.thread doing something.mythread ...