多线程交互

python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set

事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么event.wait 方法时便不再阻塞

clear:将flag设置为False

set:将flag设置为True

 

 用 threading.Event 实现线程间通信
使用threading.Event可以使一个线程等待其他线程的通知,我们把这个Event传递到线程对象中,
Event默认内置了一个标志,初始值为False。
一旦该线程通过wait()方法进入等待状态,直到另一个线程调用该Event的set()方法将内置标志设置为True时,
该Event会通知所有等待状态的线程恢复运行。

 

测试代码:

使用一个线程模拟门禁,当该事件为True的时候,门打开,3秒后自动关闭,如果门是关闭状态需要员工刷卡进入

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = 'Alben Xue'

import threading,time,random

def door():
    door_open_times = 0
    while True:
        if door_swiping_event.is_set():
            print("\033[32;1m---door opening---\033[0m")
            door_open_times += 1
        else:
            print("\033[31;1m---door closed---, swipe to open.\033[0m")
            door_open_times = 0
            door_swiping_event.wait()
        if door_open_times > 3:
            door_swiping_event.clear()

        time.sleep(0.5)

def staff(n):
    print("staff [%s] is coming.." % n)

    while True:
        if door_swiping_event.is_set():
            print("\033[34;1m---door is opening, passing...\033[0m")
            break
        else:
            print('staff [%s] sees door got closed, swipping the card...' % n)
            door_swiping_event.set()
            print('Now the door is open,please pass')
        time.sleep(1)

door_swiping_event = threading.Event()

if __name__ == "__main__":
    door_thread = threading.Thread(target=door)
    door_thread.start()

    for i in range(5):
        p = threading.Thread(target=staff,args=(i,))
        time.sleep(random.randrange(3))
        p.start()

 

posted @ 2017-07-10 14:47  alben-xue  阅读(448)  评论(0编辑  收藏  举报