python中如何建立執行緒

2021-09-12 10:58:06 字數 2221 閱讀 6899

在說怎麼建立執行緒之前,我覺得有必要說明一下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 ...