python併發程式設計2
阿新 • • 發佈:2018-12-10
一、訊號量
# 多程序中的元件 # ktv # 4個 # 一套資源 同一時間 只能被n個人訪問 # 某一段程式碼 同一時間 只能被n個程序執行 from multiprocessing import Process,Semaphore import time import random def ktv(i,sem): sem.acquire() print('%s走進ktv' %i) time.sleep(random.randint(1,5)) print('%s走出ktv' % i) sem.release() if __name__ =='__main__': sem=Semaphore(4) for i in range(10): p=Process(target=ktv,args=(i,sem)) p.start()
執行結果:
二、事件
#事件 from multiprocessing import Event # 一個訊號樂意是所有的程序都進入阻塞狀態 # 也可以控制所有的程序解除阻塞 #一個事件被建立之後,預設為阻塞狀態 e=Event() print(e.is_set()) #檢視一個事件的狀態。預設被設定成阻塞 e.set() #將這個事件的狀態改為True print(e.is_set()) print(1234556) e.wait() #是依據e.is_set()的值開決定是否阻塞的 print(123456) e.clear() #將這個時間的狀態改為False print(e.is_set()) e.wait() # 等待事件的訊號變為True print('8'*10) # set 和 clear #分別用來修改一個事件的狀態 True和False # is_set 用來檢視一個事件的狀態 # wait 是依據事件的狀態開決定自己是否在wait處阻塞 # false 是阻塞 True 是不阻塞
執行結果:
事件案例之紅綠燈:
from multiprocessing import Event,Process import time import random def cars(e,i): if not e.is_set(): print('car%i在等待'%i) e.wait() #阻塞,知道得到一個時間狀態改變成True的訊號 print('\033[34mcar%i在通過\033[0m' % i) def light(e): while True: if e.is_set(): e.clear() print('\033[31m紅燈亮了\033[0m') else: e.set() print('\033[32m綠燈亮了\033[0m') time.sleep(2) if __name__ =='__main__': e=Event() traffic=Process(target=light,args=(e,)) traffic.start() for i in range(10): car=Process(target=cars,args=(e,i)) car.start() time.sleep(random.random())
執行結果:
三、佇列
# 佇列 先進先出
#import queue 做不到程序間通訊
from multiprocessing import Queue
import time
q=Queue(5) #表示佇列的大小是5
q.put(1)
q.put(2)
q.put(3)
q.put(4)
q.put(5)
print(q.full()) #佇列是否滿了
# q.put(5) # 阻塞,直到取出一個值,空出一個地
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.empty())
# print(q.get()) #阻塞,直到裡面有資料了
while True:
try:
q.get_nowait() #阻塞並且會報錯
except:
print('佇列為空')
time.sleep(5)
# for i in range(6):
# q.put(i)
執行結果:
佇列之案例:
from multiprocessing import Queue,Process
def produce(q):
q.put('hello')
def consume(q):
print(q.get())
if __name__=='__main__':
q=Queue()
p=Process(target=produce,args=(q,))
p.start()
c = Process(target=consume, args=(q,))
c.start()
執行結果: