Python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait、clear、set,通过Event来实现两个或多个线程间的交互。

事件处理的机制:全局定义了一个“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会通知所有等待状态的线程恢复运行。

事件是一个简单的同步对象,该事件表示一个内部标志和线程可以等待标志被设置,或者自己设置或清除标志。

event = threading.Event()#客户端线程可以等待标志被设置

event.wait() #服务器线程可以设置或重置它

event.set() #如果该标志已设置,则等待方法不会执行任何操作。

event.clear()#如果标志被清除,等待将被阻塞,直到它再次被设置。

任何数量的线程都可能等待相同的事件。

举例:

下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红灯停,绿灯行的规则。

import threading

import time,random

event = threading.Event()

def lighter():

count = 0

event.set() #先设置绿灯

while True:

if count > 5 and count < 10 : #改成红灯

event.clear() #把标注位清空

print("\033[41;1m red light is on...\033[0m")

elif count > 10:

event.set() #变绿灯

count = 0

else:

print("\033[42;1m green is on...\033[0m")

time.sleep(1)

count += 1

def car(name):

while True:

time.sleep(random.randrange(10))

if event.is_set(): #设置标志位代表绿灯

print("[%s] running ..." % name )

else:

print("[%s] sees red light , waiting ..." % name )

event.wait()

print ("\033[34;1m[%s] green light is on ,start going ...\033[0m" % name)

light = threading.Thread(target=lighter,)

light.start()

for i in range(3):#假设有4台机器,编号从0 - 3 ,随机抽取

car1 = threading.Thread(target=car,args=(i,))

car1.start()

输出:

green is on...

[0] running ...

green is on...

green is on...

[0] running ...

green is on...

green is on...

green is on...

[2] running ...

red light is on...

[1] sees red light , waiting ...

red light is on...

red light is on...

[0] sees red light , waiting ...

red light is on...

green is on...

[1] green light is on ,start going ...

[0] green light is on ,start going ...

green is on...

参考大王的例子

import threading,time

import random

def light():

if not event.isSet():

event.set() #设置标志位,wait就不阻塞,为绿灯状态

count = 0

while True:

if count < 5:

print('\033[42;1m--green light on---\033[0m')

elif count < 8:

print('\033[43;1m--yellow light on---\033[0m')

elif count <15:

if event.isSet():

event.clear()

print('\033[41;1m--red light on---\033[0m')

else:

count = 0

event.set() #count归零,重新设置标志位,打开绿灯

time.sleep(1)

count +=1

def car(n):

while 1:

time.sleep(random.randrange(10))

if event.isSet(): #设置标志位,表示绿灯

print("car [%s] is running.." % n)

else:

print("car [%s] is waiting for the red light.." %n)

if __name__ == '__main__':

event = threading.Event()

Light = threading.Thread(target=light)

Light.start()

for i in range(1,5):

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

t.start()

广告,插入Timer函数讲解

Timer函数讲解

类表示只有经过一段时间才应该运行的动作,定时器和线程一样,通过调用它们的start()方法来启动。通过调用cancel()方法可以停止计时器(在其动作开始之前)。计时器在执行其动作之前等待的时间间隔可能与用户指定的时间间隔不完全相同。

举例:

import threading

def hello():

print("hello world")

t = threading.Timer(30,hello) #30为等待的时间,按秒计算

t.start()

输出:

hello world

python前景如何调用带有event参数的方法_13、第七 - 网络编程基础 - Python中协程EVENT()函数-事件函数...相关推荐

  1. 调用带有 out 参数的方法时检查弃元参数

    前言 C# 支持弃元,弃元是应用程序代码中故意未使用的占位符变量.弃元将意图传达给编译器和读取代码的其他人:你打算忽略表达式的结果. 通过为变量分配下划线(_)作为其名称,可以指示变量是弃元变量. 例 ...

  2. Oracle调用带有out参数的存储过程

    当我们在oracle中写完一个存储过程,我们通常需要使用测试调用存储过程,调用测试之后,然后提交执行结果,就可以去数据库中执行sql,查看我们的存储过程执行的数据是否符合预期效果. 实际测试中,我们可 ...

  3. JS调用后台带参数的方法

    JS调用后台带参数的方法 对于前台调用后台的方法,我们想到最多的就是用AJAX,这个是毋庸置疑的, 我就不再这里多说了.我今天主要想说的是用JS调用后台的方法. 对于后台往前台传值,用这种<%= ...

  4. python request请求参数_使用python将请求的requests headers参数格式化方法

    如下所示: import json # 使用三引号将浏览器复制出来的requests headers参数赋值给一个变量 headers = """ Host: zhan. ...

  5. axis调用webservice不同参数的方法

    //axis调用webservice不同参数的方法总结 // 调用输入参数是String,返回参数是String的webservice private static boolean doString( ...

  6. python网络编程证书_《Python网络编程基础》笔记

    python网络编程基础 ================== Author: lujun9972 Date: 2013-03-08 22:29:20 CST Table of Contents == ...

  7. python网络编程基础知识_python网络编程基础

    一.客户端/服务器架构 网络中到处都应有了C/S架构,我们学习socket就是为了完成C/S架构的开发. 二.scoket与网络协议 如果想要实现网络通信我们需要对tcpip,http等很多网络知识有 ...

  8. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  9. python协程库_python中协程的详解(附示例)

    本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...

  10. [编程基础] Python命令行解析库argparse学习笔记

    Python argparse教程展示了如何使用argparse模块解析Python中的命令行参数. 文章目录 1 使用说明 1.1 Python argparse可选参数 1.2 Python ar ...

最新文章

  1. android sqlite 自增长序列号归0
  2. 《编码:隐匿在计算机软硬件背后的语言(美)》读书笔记六
  3. Spark SQL Catalyst源代码分析Optimizer
  4. [图形学]切向空间(Tangent Space)
  5. CS231n课程笔记翻译系列之目录汇总
  6. 【多图】近距离接触甲骨文总裁马克赫德,Oracle在上海香格里拉酒店数据中心优化专题研讨会...
  7. python两个数相加时_两数相加 leetcode Python
  8. html 01前沿-web介绍
  9. 认真测试直播软件,直播这么火,你知道怎么测试直播软件吗?
  10. 中文验证码 php_还在苦恼验证码怎么实现?看看这个验证码组件合集,你想要的都有...
  11. Linux的实际操作:搜索查找类的实用指令(find locate grep 管道符|)
  12. 每日一算法 ---- 冒泡排序
  13. C语言学习笔记---typedef 简介
  14. MDK/KEIL4/KEIL5 安装教程
  15. 2018.6清北学堂day3下午笔记
  16. 程序员需要了解的先秦文学
  17. 2018年专业技术人员权益保护-测试题答案
  18. 考研计算机专业英语面试自我介绍,计算机研究生面试英文自我介绍
  19. [python] 基于Gradio可视化部署机器学习应用
  20. 文本生成的几种简单方法

热门文章

  1. oracle技术之oracle备份恢复概述
  2. Cubieboard通过aria2和minidlna来架设家庭媒体中心
  3. jQuery 使用收集
  4. 搭建一个服务器框架,进程间利用管道通信,线程处理数据
  5. 玩转MacBook的五个使用技巧
  6. macOS Big Sur中“通知中心”的小组件
  7. Mac电脑很早以前就删除的信息,现在想要恢复该怎么做?
  8. 利用zabbix监控ogg进程(Windows平台下)
  9. Docker 命令总结
  10. 华住:移动时代,自主可控的架构秘密