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() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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搭建本