zoukankan      html  css  js  c++  java
  • threading模块的threading.Event方法_模拟红绿灯程序

    本程序参考链接https://www.cnblogs.com/chengd/articles/7770898.html

    在学习查阅别人的代码时,对threading.Event有疑问,认真研究了一下下,故记录下来

    以下为个人理解,如有不恰当的地方,欢迎指出来,谢谢

    Python threading模块提供Event对象用于线程间通信。用于主线程控制其他线程的执行,事件主要提供了四个方法wait、clear、set、isSet

    • set():可设置Event对象内部的信号标志为True
    • clear():可清除Event对象内部的信号标志为False
    • isSet():Event对象提供了isSet()方法来判断内部的信号标志的状态。当使用set()后,isSet()方法返回True;当使用clear()后,isSet()方法返回False
    • wait():该方法只有在内部信号为True的时候才会被执行并完成返回。当内部信号标志为False时,则wait()一直等待到其为True时才返回

    通过Event来实现一个红绿灯例子,

    即启动一个线程做交通指挥灯,生成几个线程做汽车,汽车行驶按照红灯停绿灯行的规则

     1 #cherry_cui
     2 
     3 
     4 import threading, time                            # 导入所需的模块
     5 import random
     6 
     7 
     8 def light():                                      # 定义light函数
     9     if not event.isSet():
    10         event.set()                                # 初始化isSet()为True:若isSet为True,不执行set();若isSet为False,执行set()
    11     count = 0
    12     while True:
    13         if count < 10:
    14             print('33[42;1m---green light on---33[0m')
    15         elif count < 13:
    16             print('33[43;1m---yellow light on---33[0m')
    17         elif count < 20:
    18             if event.isSet():                     # 若isSet()为True,执行clear(),isSet()返回False
    19                 event.clear()
    20             print('33[41;1m---red light on---33[0m')
    21         else:
    22             count = 0
    23             event.set()                            # 打开绿灯
    24         time.sleep(1)                              # 休眠1s才能让car()有机会获取CPU的执行权
    25         count += 1
    26 
    27 
    28 def car(n):                                       # 定义car函数
    29     while 1:
    30         time.sleep(random.randrange(3, 10))       # 休眠3s到10s(随机)才能让light()有机会获取CPU的执行权
    31         print(event.isSet())                      # 打印当前light()中isSet的状态
    32         if event.isSet():                         # 获取light()中isSet的状态,若为True则执行下一个语句
    33             print("car [%s] is running..." % n)
    34         else:
    35             print('car [%s] is waiting for the red light...' % n)  # event.wait()    #红灯状态下调用wait方法阻塞,汽车等待状态
    36 
    37 
    38 if __name__ == '__main__':
    39     car_list = ['aa', 'bb', 'cc']                # 定义car数组
    40     event = threading.Event()                     # 通过threading.Event()生成一个event对象和对象的引用event
    41 
    42     Light = threading.Thread(target=light)        # 创建一个以light为目标的线程任务
    43     Light.start()                                 # 启动Light线程
    44 
    45     for i in car_list:                            # 遍历car数组
    46         t = threading.Thread(target=car, args=(i,))                    # 创建一个以car方法的线程任务,传car数组的数据给car()
    47         t.start()                                  # 启动t线程
    View Code

     运行结果:

     在本程序中,新学习到的地方,记录如下:

    • Python输出文字颜色的设置

     

    • Python标准库 threading.Thread

    使用Thread类创建线程

    t = threading.Thread(target=car, args=(i,))
    t.start()  

    t= Thread(target=function_name, args=(function_parameter1, function_parameterN))

    function_name:需要线程去执行的方法名

    args:线程执行方法接收的参数,该属性是一个元组,若只有一个参数则需要在末尾加逗号

    start():为启动进程

  • 相关阅读:
    js 的一些兼容性写法
    浏览器 Event对象 及 属性 的兼容处理
    js 三元表达式 复杂写法
    Angular.js中使用$watch监听模型变化
    Android学习之——ViewPager及应用引导页的开发
    Android开发中常用的库总结(持续更新)
    Android学习之——GridView
    Android开发工具——Android studio1.0正式版使用技巧
    Android学习之——ListView下拉刷新
    Android学习之——ListView
  • 原文地址:https://www.cnblogs.com/cherrycui/p/9047487.html
Copyright © 2011-2022 走看看