python的偽執行緒與排他鎖

2021-09-12 14:38:10 字數 2154 閱讀 8418

python中的執行緒竟然是偽執行緒,確實這是毋庸置疑的,這是作為一名程式設計師的我今天才知道的,為什麼會這樣呢?

原因在於剛開始python語言的開發時候,電腦用的是單核cpu,而python語言的設計者設計了乙個gil,用它來作為乙個排它鎖,以便完成計算機的任務。

隨著cpu核數的增多,python開發人員也意識到這個問題,當時python開發的原班人馬也想修改gil,但是最後還是放棄了,因為gil作為python開發的源頭機制牽扯的東西太多,修改難度太高。他們修改的是python語言直譯器。那麼什麼是python語言直譯器,以及python檔案是怎麼執行的呢?

廢話不說,上圖:

python語言直譯器,就是把程式設計師能看懂的語言(簡單來說是相對高階的語言)轉換成電腦能看懂的語言(機器語言),相當於乙個翻譯官,把人說的話翻譯給鳥聽翻譯給魚聽等等。

那麼問題來了,計算機語言包括哪些呢?

哈哈,上圖吧!

因此python語言產生了乙個缺點-----速度慢效率差,這可能是當時python語言直譯器是基於單核cpu的機制所引起的。但是python也具有自己明顯的優點,因為擁有大量的三方庫,所以開發簡單高效。

為了解決這個問題python的開發人員又研究出一種新的機制---協程,協程這個東西貌似是python獨有的(讀書少不敢太確定),協程這個東西比執行緒要小,所以又叫微執行緒,微執行緒是比執行緒更小的排程單位。

協程有兩種實現方式:(1)通過yield實現    (2)通過greentlet實現

第一種方式的實現**如下:

import time

from greenlet import greenlet

def consumer(name):

while true:

baozi=yield #yield有返回和中斷的能力

print("%s--吃了包子%d"%(name,baozi))

time.sleep(1)

def producer():

# r=c1.__next__()

# r=c2.__next__()

c1.__next__()

c2.__next__()

n=1while true:

print("廚師一下生產兩個包子------生產了包子%d"%(n))

c1.send(n)

c2.send(n+1)

n+=2

if __name__ == '__main__':

c1=consumer("c1")

c2=consumer("c2")

p=producer()

第二種實現方式:

from greenlet import greenlet

def test1():

print("10")

# 切換gr2中執行

gr2.switch()

print("12")

# 切換gr2中執行

gr2.switch()

def test2():

print("11")

# 切換gr1中執行

gr1.switch()

print("13")

#把要執行的**放入greenlet()中

gr1=greenlet(test1)

gr2=greenlet(test2)

#切換gr1中執行

gr1.switch()

方式二的結果為 10,11,12,13

在這裡說明一下:協程是乙個單獨的執行單元,自帶cpu上下文,什麼意思呢,簡單來說就是可以記憶自己上次執行的狀態,以及下下次應該執行什麼**。比如下圖:

在斐波那契函式中每次執行next(),就會出來乙個值,就是因為他記憶了自己上次執行的狀態,要不然就會丟失資料了。

更簡明來說yield就是分割上下文的地方。

mysql排他鎖 mysql共享鎖與排他鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...

共享鎖與排他鎖

共享鎖 s鎖 如果事務t對資料a加上共享鎖後,則其他事務只能對a再加共享鎖,不能加排他鎖。獲准共享鎖的事務職能讀取資料,不能修改資料。排他鎖 x鎖 如果事務t對資料a加上排他鎖後,則其他事務不能在對a加任何型別的封鎖。獲准排他鎖的事務既能讀取資料,也能修改資料。資料庫死鎖的原因 若干事務相互等待對方...

mysql共享鎖與排他鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...