python 執行緒之間的通訊

2021-09-26 19:05:28 字數 2250 閱讀 6784

建立方法:

import threading

cond=threading.condition()

屬性方法:

acquire([timeout])/release(): 呼叫關聯的鎖的相應方法。 該物件使用的是rlock鎖。

wait([timeout]): 呼叫這個方法將使執行緒進入condition的等待池等待通知,並釋放鎖。

使用前線程必須已獲得鎖定,否則將丟擲異常。

notify(): 呼叫這個方法將從等待池挑選乙個執行緒並通知,收到通知的執行緒將自動呼叫

acquire()嘗試獲得鎖定(進入鎖定池);其他執行緒仍然在等待池中。呼叫這個方法不會

釋放鎖定。使用前線程必須已獲得鎖定,否則將丟擲異常。

notifyall(): 呼叫這個方法將通知等待池中所有的執行緒,這些執行緒都將進入鎖定池

嘗試獲得鎖定。呼叫這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將丟擲異常。

機械人對話測試**:

cond = threading.condition()

def robot1():

cond.acquire()

print('robot2在嗎?')

cond.notify()

cond.wait()

print('我是robot1.')

def robot2():

cond.acquire()

cond.wait()

print('在,請問你是?')

cond.acquire()

cond.notify()

cond.wait()

if __name__=='__main__':

t1 = threading.thread(target=robot1)

t2 = threading.thread(target=robot2)

t2.start()

time.sleep(1)

t1.start()

使用該物件需要注意的兩個點:

1、執行順序,開始時的接收者應該先進入wait()狀態。

2、wait()方法將在notify()和鎖釋放後才可以進行返回,因為notify()必須要在獲得鎖的情況下才能執行,所以鎖釋放(wait或release)必須在notify之後加上,經過測試,當另一線程呼叫notify時不會使得wait馬上返回,只有呼叫了鎖釋放,才會生效。

測試**的輸出結果:

robot2在嗎?

在,請問你是?

我是robot1.

建立方法:

import threading

event = threading.event()

物件屬性

wait():檢查標誌位,若為false則阻塞,等待true時返回。

clear():標誌為設定為false,此時的wait()方法將阻塞。

set():標誌位設定為true,wait()脫離阻塞狀態向下執行。

測試**:

event = threading.event()

def mainthread():

i = 0

while(true):

event.wait()

print(i)

i += 1

time.sleep(1)

def controlthread():

while(true):

print('start')

event.set()

time.sleep(5)

print('stop')

event.clear()

time.sleep(5)

if __name__=='__main__':

t1 = threading.thread(target=mainthread)

t2 = threading.thread(target=controlthread)

t1.start()

t2.start()

兩個執行緒,乙個執行緒每隔一秒輸出乙個數,另乙個執行緒每隔五秒控制一次開關變化(開變關,關變開),輸出結果:

start01

234stop

start56

789stop

...

執行緒之間的通訊

class resclass inthread extends thread override public void run else count count 1 2 class outthread extends thread override public void run 資料發生錯亂,造成...

程序之間 執行緒之間的通訊方式

1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...

多執行緒之間通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類 class res輸入執行緒資源 class intthrad extends thread overr...