随笔 - 331,  文章 - 92,  评论 - 54,  阅读 - 60万
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# 线程之间用于交互的一个对象,这个event是一个内部的标签,线程可以等待这个标签的状态
#举个例子,比如红绿灯是一个线程,三辆汽车是3个线程,如果为红灯,则三个汽车的线程必须
#要停止,如果是绿灯,则三个汽车的线程就可以跑起来
 
 
 
import threading
 
#创建一个事件
event = threading.Event()
 
 
#如果标签没有设置,则线程会一直等待,直到标签的状态被设置,如果设定了标签,则这里的
#wait就不阻塞了,该动作什么都不做,如果没有设置,则该wait这里就一直阻塞,无论有多线程
#都可以等待一个事件
# event.wait()
 
 
#设定标签和清空标签
event.set()
event.clear()
 
#下面是一个红绿灯例子,很有意思
# import threading
# import time
# import random
# def light():
# #定义了一个灯的函数
#     if not event.is_set():   #如果事件未定义,则设置该标签,设置该标签,则如果有线程在等待这个标签,就不会出现阻塞,也就是说初始状态是绿灯
#         event.set()
#     count = 0
#     while True:
#         if count < 10:
#             #如果事件小于10,则不对事件做任何处理
#             print("\033[42;1m----green light on----\033[0m")
#         elif count < 15:
#             #如果事件小于15,则不对事件做任何处理
#             print("\033[43;1m----yellow light on----\033[0m")
#         elif count < 20:
#             #如果事件小于20,也就是说如果时间在15和20之间,则进入红灯状态,如果是红灯状态,则汽车就要阻塞,要实现阻塞,我们就需要对事件设置状态
#             if event.is_set():
#                 event.clear()
#             print("\033[41;1m----red light on----\033[0m")
#         else:
#             count = 0
#             event.set()
#         time.sleep(1)
#         count += 1
#
# def car(n):
#     while 1:
#         time.sleep(1)
#         if event.is_set():
#             #如果事件设置了状态,则后面的语句不阻塞,照常执行
#             print("cat [%(name)s] is running" %{"name":n})
#         else:
#             event.wait()
#             #如果这个时间没有设置状态,则该事件一直阻塞在这里,等待该事件被设置状态
#             print("cat [%(name)s] is wait for red light" % {"name": n})
#
# if __name__ == '__main__':
#     event = threading.Event()
#     Light = threading.Thread(target=light)
#     Light.start()
#     for i in range(3):
#         t = threading.Thread(target=car,args=[i,])
#         t.start()
#
 
 
import threading
import time
import random
 
# 1、我们先定义一个灯的函数,由灯的线程去调用这个函数,绿灯是允许通过,红灯是不允许通过,其中绿灯10s,红灯也是10s,这里我们就要用到事件
# 如果是绿灯,我们则设置事件的状态,如果是红灯,我们则取消事件的状态,初始状态为红灯
def light():
    if event.is_set():
        #设置初始状态,该初始状态为事件没有状态,则进程一直会阻塞
        event.clear()
    count = 0
    while True:
        #进入交通灯灯循环的状态
        if count < 10:
            print("\033[41;1m----red light on----\033[0m")
        elif count < 20:
            print("\033[42;1m----green light on----\033[0m")
            if not event.is_set():
                event.set()
            else:
                pass
        else:
            count = 0
            if event.is_set():
                event.clear()
        count += 1
        time.sleep(1)
 
 
def car(n):
    while True:
        time.sleep(1)
        if event.is_set():
            print("car [%(name)s] is running" %{"name":n})
        else:
            print("car [%(name)s] is waiting for red light" % {"name": n})
            event.wait()
 
# 2、我们在定义一个车的函数,由车的线程去调用这个函数
 
 
if __name__ == '__main__':
    light_thread = threading.Thread(target=light)
    light_thread.start()
    for i in range(3):
        t = threading.Thread(target=car, args=[i,])
        t.start()

  

posted on   bainianminguo  阅读(3088)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示