Event

一、前言

  Python线程的Event(事件)用于主线程控制其他线程的执行,Event主要提供了 set、wait 、clear等方法

set():
# 将 flag设置为 True,形象的说就是设置为绿灯,表示可以通行

clear():
# 将flag清除即 False,也就是说设置为红灯,不能通行

wait():
# 如果flag 为 False,event.wait 就会阻塞,如果flag为True,event.wait就通行
# 多个线程可以等待同一个事件

二、红绿灯实例

  有个红灯停,绿灯行的简单事例:  

# -*- coding: UTF-8 -*-

import time
import threading


class EventThread(threading.Thread):

    "使用event事件让主线程来控制其他线程"
    
    def run(self):
        count = 0
        event.set()  # 先设置绿灯
        while True:
            if count < 5:
                print("\033[42;1m green light is on...\033[0m")
            elif count < 10:
                event.clear()  # 把标志位清除,意味着变为红灯
                print("\033[41;1m red light is on...\033[0m")
            else:
                event.set()
                count = 0
            time.sleep(1)
            count += 1


class CarThread(threading.Thread):

    "汽车线程受红绿灯控制"
    
    def __init__(self, name):
        super(CarThread, self).__init__()
        self.name = name

    def run(self):
        while True:
            if event.is_set():  # 代表绿灯
                print('[%s] running...' % self.name)
                time.sleep(1)  # 跑的进程少一些
            else:
                print('\033[41;1m red light,cannot run...\033[0m')
                event.wait()  # 等待标志位设置,即等待绿灯的意思
                print('\033[42;1m [%s], green light now, can run...\033[0m' % self.name)


event = threading.Event()

if __name__ == '__main__':

    light = EventThread()
    light.start()
    car_names = ['car1', 'car2', 'car3', 'car4', 'car5']
    for i in range(5):
        car = CarThread(car_names[i])
        car.start()

  汽车只会在绿灯的时候跑起来

posted @ 2017-11-29 19:54  Bigberg  阅读(332)  评论(0编辑  收藏  举报