1. 程式人生 > >python併發程式設計2

python併發程式設計2

一、訊號量

# 多程序中的元件
# 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()

執行結果: