python鎖機制 Python高階之多執行緒鎖機制

2021-10-11 17:22:02 字數 3201 閱讀 9090

1.多程序的優勢:為了同步完成多項任務,通過提高資源使用效率來提高系統的效率。

2.檢視執行緒數:threading.enumerate()函式便可以看到當前執行緒的數量。

3.檢視當前執行緒的名字:threading.current_thread()可以看到當前執行緒的資訊。

4.類可以繼承 threading.thread

# import threading

# import time

# class codingthread(threading.thread):

# def run(self):

# for x in range(3):

# print('正在寫指令碼:%s'%threading.current_thread())

# time.sleep(1)

# class modelthread(threading.thread):

# def run(self):

# for x in range(3):

# print('正在建立模型:%s'%threading.current_thread())

# time.sleep(1)

# # 主線程入口

# def main():

# t1 = codingthread()

# t2 = modelthread()

# t1.start()

# t2.start()

# if __name__ == '__main__':

# main()

# 多執行緒共享全域性變數的問題:

多執行緒都是在同乙個程序中執行的。因此在程序中的全域性變數所有執行緒都是可共享的。

這就造成了乙個問題,因為執行緒執行的順序是無序的。有可能會造成資料錯誤。

# import threading

# values = 0

# 全域性變數使用執行緒時,避免資料不出現亂序,則加上鎖

# glock = threading.lock()

# def get_ticket():

# global values

# # 加鎖

# glock.acquire()

# for x in range(100000):

# values += 1

# # 解鎖

# glock.release()

# print('values:%d' % values)

# def main():

# for x in range(3):

# t = threading.thread(target=get_ticket)

# t.start()

# 應該列印出來是: 100000,200000,300000

# 實際列印出來是: 100000,124976,224976

# 所有使用到threading.lock

加上鎖後返回的值:

values:100000

values:200000

values:300000

# if __name__ == '__main__':

# main()

# lock版本生產者和消費者模式:

生產者和消費者模式是多執行緒開發中經常見到的一種模式。

生產者的執行緒專門用來生產一些資料,然後存放到乙個中間的變數中。

消費者再從這個中間的變數中取出資料進行消費。

但是因為要使用中間變數,中間變數經常是一些全域性變數,因此需要使用鎖來保證資料完整性。

使用threading.lock鎖實現的「生產者與消費者模式」的乙個例子:

import threading

import random

import time

gmoney = 1000

glock = threading.lock()

# 記錄生產者生產的次數,達到10次就不再生產

gtime = 0

# 生產者

class producer(threading.thread):

def run(self):

global gmoney

global gtime

while true:

money = random.randint(100,1000)

glock.acquire()

if gtime >= 10:

# 解鎖返回

glock.release()

break

gmoney += money

print('%s存入了%d元錢,還剩%d元錢'%(threading.current_thread(),money,gmoney))

time.sleep(0.5)

gtime += 1

glock.release()

# 消費者

class consumer(threading.thread):

def run(self):

global gmoney

global gtime

while true:

money = random.randint(100, 1000)

glock.acquire()

if gmoney > money:

gmoney -= money

print('%s消費了%d元錢,還剩%d元錢' % (threading.current_thread(), money, gmoney))

time.sleep(0.5)

else:

# 如果錢不夠了,有可能是已經超過了次數,這時候就判斷一下

if gtime >= 10:

glock.release()

break

print('%s消費了%d元錢,還剩%d元錢,不足!!!' % (threading.current_thread(), money, gmoney))

glock.release()

def main():

for x in range(3):

c1 = consumer(name='消費者執行緒數%s'%x)

c1.start()

for x in range(5):

p1 = producer(name='生產者執行緒數%s'%x)

p1.start()

if __name__ == '__main__':

main()

python鎖機制 python 鎖機制

當有兩個或跟多個執行緒或程序需要操作乙個變數或程序時,會出現意想不到的結果,這是因為執行緒或程序時迸發進行的,對同意變數或檔案操作時,會出現同時對其操作,從到導致邏輯錯誤。bin usr env python coding utf 8 import multiprocessing import ti...

python鎖機制 python的鎖機制

鎖 lock lock 指令鎖 是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態 鎖定和非鎖定,以及兩個基本的方法。可以認為lock有乙個鎖定池,當執行緒請求鎖定時,將執行緒至於池中,直到獲得鎖定後出池。池中的執行緒處於狀態圖中的同步阻塞狀態。構造方法 l...

python多執行緒鎖機制

在多執行緒程式設計中常用到的乙個概念就是鎖,它用於將執行緒需要獨佔的資源進行加鎖,使用後再進行釋放,防止死鎖發生。此處給出乙個不加鎖的多執行緒例子 實現整數n在每個執行緒內加1並列印 usr bin python coding utf 8 import threading import time c...