當多個執行緒同時訪問乙個變數的時候,會產生共享變數的問題。
問題解決:鎖(是乙個標誌,表示乙個執行緒正在占用一些資源),訊號燈
鎖的使用方法:上鎖,使用共享資源,放心的用,取消鎖,釋放鎖。
案例1
import threading
sum=0
loopsum=1000000
lock=threading.lock()
def myadd():
global sum,loopsum
for i in range(1,loopsum):
#上鎖,申請鎖
lock.acquire()
sum+=1
#釋放鎖
lock.release()
def myminu():
global sum, loopsum
for i in range(1,loopsum):
#上鎖,申請鎖
lock.acquire()
sum-=1
#釋放鎖
lock.release()
if __name__=='__main__':
print('staring.....'.format(sum))
t1=threading.thread(target=myadd,args=())
t2=threading.thread(target=myminu,args=())
t1.start()
t2.start()
t1.join()
t2.join()
print('done....'.format(sum))
如果乙個資源/變數,他對於多執行緒來講,不用枷鎖也不會引起任何問題,則稱為執行緒安全。
可以用來待見訊息佇列
案例2
import threading
import time
#from queue import queue
import queue
class producer(threading.thread):
def run(self):
global queue
count=0
while true:
if queue.qsize()<1000:
for i in range(100):
count=count+1
msg='生成產品'+str(count)
queue.put(msg)
print(msg)
time.sleep(0.5)
class consumer(threading.thread):
def run(self):
global queue
while true:
if queue.qsize() >100:
for i in range(3):
msg = self.name+'消費了' +queue.get()
print(msg)
time.sleep(0.5)
if __name__=='__main__':
queue=queue.queue()
for i in range(500):
queue.put('初始產品'+str(i))
for i in range(2):
p=producer()
p.start()
for i in range(5):
c=consumer()
c.start()
允許乙個資源最多由幾個執行緒同時使用
案例3
import threading
import time
#引數定義最多幾個執行緒同時使用資源
semaphore=threading.semaphore(3)
def func():
if semaphore.acquire():
for i in range(5):
print(threading.currentthread().getname()+'get semaphore')
time.sleep(15)
semaphore.release()
print(threading.currentthread().getname()+'release semaphore')
for i in range(8):
t1=threading.thread(target=func)
t1.start()
使用方法在乙個指定的秒數之後呼叫方法-threading.timer(sec,func)
乙個鎖可以被乙個執行緒多次申請
主要解決遞迴呼叫的時候,需要申請鎖的情況
mutex=threading.rlock()
Python 多執行緒學習02
這一次的目的是,兩個執行緒以方式合作,列印0 9的十個數字。不要漏,也不要重複。於是在上乙個程式的基礎上,修改一下,因為數字都存在content這個列表中,每次乙個執行緒先pop 出乙個數字,再列印,這樣,每個數字就只能被列印一次了。效果怎樣呢?試試吧。修改後的程式為 coding utf8 imp...
多執行緒02
什麼是使用者態和核心態 在作業系統裡面,作業系統的核心佔一部分記憶體,使用者應用程式佔一部分記憶體,核心即可以訪問自身的記憶體,也可以訪問使用者應用程式的記憶體,但是使用者應用程式只能訪問自身的記憶體,不能訪問核心的記憶體 執行緒的啟動 關閉 切換都要依賴於核心態 voliate 保證執行緒可見性 ...
多執行緒02 執行緒建立
1 方式一 繼承 thread 類,重寫run 方法,呼叫start 開啟執行緒 public class thread01 extends thread main 是主線程 public static void main string args throws interruptedexceptio...