python_並發編程——事件


1.事件

  :通過一個信號來控制多個進程同時執行或者阻塞。

    一個信號可以使所有的進程都進入阻塞狀態,也可以控制所有的進程接觸阻塞,一個事件被創建之后,默認是阻塞狀態。

from multiprocessing import Event

e = Event() #創建事件對象
print(e.is_set())   #查看一個事件的狀態:默認是阻塞即False
print(11111)
e.wait()    #依據事件狀態,來覺得是否阻塞
print(22222)

結果:

2.解除阻塞:

from multiprocessing import Event

e = Event() #創建事件對象
print(e.is_set())   #查看一個事件的狀態:默認是阻塞即False
print(11111)
e.set()     #將事件的狀態設置為True
print(e.is_set())
e.wait()    #依據事件狀態,來覺得是否阻塞
print(22222)

結果:

3.設置阻塞:

from multiprocessing import Event

e = Event() #創建事件對象
print(e.is_set())   #查看一個事件的狀態:默認是阻塞即False
print(11111)
e.set()     #將事件的狀態設置為True
print(e.is_set())
e.wait()    #依據事件狀態,來覺得是否阻塞
print(22222)
e.clear()       #將事件的狀態改為False
e.wait()
print(e.is_set())
print(33333)

結果:

應用:

from multiprocessing import Process
from multiprocessing import Event
import time
import random

class Car(Process):
    def __init__(self,e,i):
        super().__init__()
        self.e = e
        self.i = i
    def run(self):
        if not self.e.is_set():
            print('{}在等紅燈'.format(self.i))
            self.e.wait()   #阻塞,直到事件狀態改變
        print('{}車通行'.format(self.i))

class MyProcess(Process):
    def __init__(self,e):
        super().__init__()
        self.e = e

    def run(self):
        while True:
            if self.e.is_set():
                self.e.clear()
                print('紅燈')
            else:
                self.e.set()
                print('綠燈')
            time.sleep(2)

if __name__ == '__main__':
    e = Event()
    q1 = MyProcess(e)
    q1.start()
    for i in range(20):
        q2 = Car(e,i)
        q2.start()
        time.sleep(random.random()) #隨機暫停時間(0-1秒之間)

結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM