六. 併發編程 (進程事件)

一. 進程事件(multiprocessing.Event

1. Event對象的基本概述

用 multiprocessing.Event 實現線程間通訊,使用multiprocessing.Event能夠使一個線程等待其餘線程的通知,
咱們把這個Event傳遞到線程對象中;主要用於主線程控制其餘線程的執行,事件主要提供了三個方法:wait、clear、set。
事件處理的機制:

全局定義了一個Flag; 若是Flag值爲False(clear:將Flag設置爲False),則執行event.wait方法時阻塞; 若是Flag值爲True(set:將Flag設置爲True),則執行event.wait方法時不阻塞。 注: event對象默認爲False,即遇到event對象在等待就阻塞線程的執行。

  1. event.set()
  • 設置信號
  • 使用Event的set方法能夠設置Event對象內部信號標誌爲True.
  1. event.clear()
  • 清除信號
  • 能夠清除Event對象內部的信號標誌,將其設爲False。
  1. event.warit()
from multiprocessing import Event

e=Event()  # <multiprocessing.synchronize.Event object at 0x0000019295AA8400> 建立對象
print(e.is_set()) #  False  查看 狀態
e.set()     # 改變狀態Event默認是狀態是false
print(e.is_set()) # True
e.wait()     # wait有一個阻塞效果       # 在以前必須改變Event默認狀態 纔會執行wait以後的代碼
print(1111111111)

執行結果
    False
    True
    1111111111
e=Event()
print(e.is_set())  # 查看狀態
e.wait()  # 被阻塞了 由於Event默認是False  要開起後纔會執行wait以後的代碼
print("11111111")    # 不會打印出來
# 執行結果
    False
    wait1
    True
# wait(time)中的time參數能夠設置時間,當超過time時間後便可阻斷阻塞
e=Event()
print(e.is_set())  # 查看狀態
e.wait(3)  # 被阻塞了 由於Event默認是False 裏面設置時間
print("11111111")    # 也會打印
# 執行結果
    False
    11111111
from multiprocessing import Event
if __name__ == '__main__':
    e = Event()
    print(e.is_set()) #False
    # e.wait() <-會阻塞在此處
    e.clear()  #clear在wait後面,並不能生效。
    print('wait1')
    e.set()
    print(e.is_set()) #True
    e.clear()
    e.wait() #不會阻塞
    print('wait2')

False
wait1
Truepython

紅綠等 import random
import time
from multiprocessing import Process, Event

def cars(event, i ):
    if not event.is_set():
        print('cat: %s 等待紅燈' %i)
        event.wait() #阻塞直到事件狀態變爲 True的信號
    else:
        print('\033[0;32;40mcar%i經過\033[0m'%i)

def light(event):
    while True:
        if event.is_set():
            event.clear()
            print('\033[31m紅燈亮了\033[0m')
        else:
            event.set()
            print('\033[32m綠燈亮了\033[0m')
        time.sleep(2)
if __name__ == '__main__':
    event = Event()
    p = Process(target=light, args=(event,))
    p.start()
    
    for i in range(20):
        car = Process(target= cars, args=(event, i ))
        car.start()
        time.sleep(random.random())
相關文章
相關標籤/搜索