Python 多執行緒 (02)

2021-09-11 19:11:06 字數 2521 閱讀 9453

當多個執行緒同時訪問乙個變數的時候,會產生共享變數的問題。

問題解決:鎖(是乙個標誌,表示乙個執行緒正在占用一些資源),訊號燈

鎖的使用方法:上鎖,使用共享資源,放心的用,取消鎖,釋放鎖。

案例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...