广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python35 events(事件)
  • 527
分享到

Python35 events(事件)

事件events 2023-01-31 06:01:02 527人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

事件(events) 基于event实现绿灯举例的多线程 程序 import time import threading event = threading.Event() def lighter(): count = 0

事件(events)

基于event实现绿灯举例的多线程 程序

import time
import threading
event = threading.Event()

def lighter():
    count = 0
    event.set()
    ##先设置标志位为真,表示初始状态就是绿灯。否则当下面的if count > 5之前,标志位都是没有被设置的
    while True:
        if count > 5 and count <10: #大于5并且小于10就改成红灯
            # 这里代码不能只写成if count > 5,因为只要满足大于5,就不会去匹配大于10的elif条件了。
            event.clear()   #把标志位清空,检查标志位,如果标志位没有被设置,则当做红灯。
            print ("\033[41;1m red light is on...\033[0m")
            ## 这里>5 and <10的数是6-9,所以这里会打印红灯4次。
        elif count > 10:    #红灯到绿灯期间设置时间为10秒,当大于30时,设置标志位
            event.set() #设置标志位,检查到这个标志位,就当做已经绿灯
            count = 0   #用count来计数多少秒,当设置为绿灯时就清空为0秒,20秒后就红灯
        else:
            print("\033[42;1m green light is on...\033[0m")
            ## 匹配count既不大于5,也不大于10时(也就是小于5时),打印绿灯亮
            ## 这里0-5会打印绿灯6次。

        time.sleep(1)   #设置每一秒循环一次,这样20秒后就红灯,20秒到30秒后就变成绿灯。
        count += 1

def car(name):
    while True:
        if event.is_set():  #这里判断如果事件设置了标志位(表示绿灯)
            print ("[%s] running..." %name)
            time.sleep(1)
        else:   #标志位为空表示红灯
            print ("[%s] sees red light, waiting......" %name)
            event.wait()    #如果判断标志位为空,则阻塞程序,直到标志位为真。
            print ("[%s] green light is on, start Going... "%name)

light = threading.Thread(target=lighter,)
light.start()

car1 = threading.Thread(target=car,args=("car1",))
car1.start()

执行结果:
image_1c7gpn752uom1q3li4g1jejv8d9.png-60.1kB
可以看到绿灯时,车就正常行驶; 红灯时就等待。


队列(queue)

FIFO(先进先出)

队列的作用:
1、解耦:避免两者之间的过度依赖,以免其中一方出现问题,另一方不能再执行。
2、效率:增加数据处理的效率。

队列可以理解为一个容器,用来放数据的,不过这个容器中的数据是有顺序的。


import queue

q = queue.Queue()   #先生成一个队列对象
q.put("d1") #将d1这个数据放入队列中
q.put("d2") #将d2这个数据也放入队列中
q.put("d3")

q.qsize()   # 来查询当前队列数据数量

print (q.get()) #这里不能取出指定的数据,只能根据先进先出的顺序来取出数据,所以这里取出的是"d1"这个数据
print (q.get()) #这里取出的是"d2"这个数据
print (q.get()) #这里取出的是"d3"这个数据

执行结果:
d1
d2
d3
## 先进先出的顺序来get数据

10办公


import queue

q = queue.Queue()   
q.put("d1") 
q.put("d2") 
q.put("d3")

q.qsize()   

print (q.get()) 
print (q.get()) 
print (q.get()) 

print (q.get()) 
## 之前只进入了3个数据,且3个数据也被取出了,此时数据为空,我再次取数据就会卡在这,因为没有数据了,会一直卡在这等待新的数据进来

执行结果:

image_1c7gsfdq6jl52651e289u71d1km.png-12.2kB
可以看到程序卡主了。


import queue

q = queue.Queue()
q.put("d1")
q.put("d2")
q.put("d3")

q.qsize()

print (q.get())
print (q.get())
print (q.get())

print (q.get(block=False))
## 默认就存在block=True这个参数,True的话表示如果数据为空就卡主,设置False就不卡主

image_1c7gt0t4e130n10pn14hc1uo0i541g.png-27.9kB
不在卡主,并且抛出异常

import queue

q = queue.Queue()
q.put("d1")
q.put("d2")
q.put("d3")

q.qsize()

print (q.get())
print (q.get())
print (q.get())

print (q.get(timeout=3))
## 设置如果卡主的话,卡多久,这里设置为卡3秒

image_1c7gt2dq61bkp2f01t5ncqp1acg1t.png-27.2kB
卡3秒后,依然没有数据进来,会抛出异常。


import queue

q = queue.Queue()
q.put("d1")
q.put("d2")
q.put("d3")

q.qsize()

print (q.get())
print (q.get())
print (q.get())

print (q.get_nowait())
## 使用get_nowait()来取数据,如果取的数据是空就会抛出异常。

image_1c7gsmkcd33ka4inh91dm63b913.png-36.5kB
可以使用try,except异常来使用get_nowait()来解决获取空数据的问题;
也可以使用if q.qsize()来判断==0的话,就是空数据,然后在做下一步操作。


import queue

q = queue.Queue(maxsize=3)  ## 设置队列中最多可以有多少个数据
q.put("d1")
q.put("d2")
q.put("d3")
q.put("d4") ##因为设置最有能有3个数据,当我们设置第4个数据的时候前三个数据还没有取出,就会卡主
##可以设置多个线程,边放边取数据,就不会卡主了。

import queue

q = queue.Queue(maxsize=3)
q.put("d1")
q.put("d2")
q.put("d3")
q.put("d4",block=False,timeout=3)
## put也支持block和timeout

Lifo (last in first out 后进先出)

一般场景都是先入先出,后入先出的情况比较少。
卖水果就可以实现后入先出的场景,因为后来的水果比较新鲜,所以就先卖出去的快。

import queue

q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)

print (q.get())
print (q.get())
print (q.get())

执行结果:
3
2
1

PriorityQueue(优先级队列)

存储数据时可以设置优先级队列


import queue

q = queue.PriorityQueue()
q.put((10,"Amy"))
q.put((-1,"Peter"))
q.put((3,"Zhangsan"))
q.put((6,"lisi"))

print (q.get())
print (q.get())
print (q.get())
print (q.get())

执行结果:
(-1, 'Peter')   #优先级最高
(3, 'Zhangsan')
(6, 'lisi')
(10, 'Amy')     #优先级最低
##将数字放在前面就按照数字越小,越优先出
## 也可以按照字母等顺序来排列。

生产者消费者模型

假如生产者是视频服务器,消费者是用户,用户消费(看视频),将请求转到后台服务器,生产者处理、提供视频数据。
但是消费者并不关心你后台提供了多少台服务器,所以这种模型解耦比较好。

import threading,time
import queue

q = queue.Queue()

def Producer(name):
    for i in range(10):
        q.put("骨头%s"%i) ##生产10个骨头

def Consumer(name):
    while q.qsize() > 0:    #判断队列还有数据就循环
        print ("[%s]取到[%s]并且吃了它..."%(name,q.get())) #消费骨头

p = threading.Thread(target=Producer,args=("LiSi",))
c = threading.Thread(target=Consumer,args=("Dog",))

p.start()
c.start()

执行结果:
[Dog]取到[骨头0]并且吃了它...
[Dog]取到[骨头1]并且吃了它...
[Dog]取到[骨头2]并且吃了它...
[Dog]取到[骨头3]并且吃了它...
[Dog]取到[骨头4]并且吃了它...
[Dog]取到[骨头5]并且吃了它...
[Dog]取到[骨头6]并且吃了它...
[Dog]取到[骨头7]并且吃了它...
[Dog]取到[骨头8]并且吃了它...
[Dog]取到[骨头9]并且吃了它...
## 生产了10个骨头,都被dog给吃了。

import threading,time
import queue

q = queue.Queue(maxsize=10) #最大放入十个骨头

def Producer(name):
    count = 1
    while True: #为了持续性的生产骨头,这里使用while。
            q.put("骨头%s"%count) ##当骨头超过10个的时候,就卡主了,直到骨头被取出少于10时循环放骨头进来
            print ("生产了骨头%s"%count)
            count += 1
            time.sleep(2)   #两秒生产1个

def Consumer(name):
    while True:    #这里设置True,而不是>0,因为刚生产1个被吃掉的话,就不大于0了,dogs就不会再吃骨头
        print ("[%s]取到[%s]并且吃了它..."%(name,q.get()))
        time.sleep(1)   #这里设置每秒吃1个骨头但是因为生产的慢(2秒生产1个),所以就吃的慢。

p = threading.Thread(target=Producer,args=("LiSi",))
c1 = threading.Thread(target=Consumer,args=("Dog1",))
c2 = threading.Thread(target=Consumer,args=("Dog2",))

p.start()
c1.start()
c2.start()

执行结果:
生产了骨头1
[Dog1]取到[骨头1]并且吃了它...
生产了骨头2
[Dog2]取到[骨头2]并且吃了它...
生产了骨头3
[Dog1]取到[骨头3]并且吃了它...
生产了骨头4
[Dog2]取到[骨头4]并且吃了它...
生产了骨头5
[Dog1]取到[骨头5]并且吃了它...
生产了骨头6
[Dog2]取到[骨头6]并且吃了它...
........

def Producer(name):
    count = 1
    while True:
            q.put("骨头%s"%count)
            print ("生产了骨头%s"%count)
            count += 1
            time.sleep(0.5)   #现在0.5秒生产1个,相当于1秒生产2个

def Consumer(name):
    while True:
        print ("[%s]取到[%s]并且吃了它..."%(name,q.get()))
        time.sleep(1)   
        ##因为生产的快,两个线程就吃的快(每个线程每隔1秒吃一个)
        ##两个线程相当于1秒能吃2个,刚好与生产速度持平;
        ##如果生产过快的话,就是生产大于消费的速度了。

p = threading.Thread(target=Producer,args=("LiSi",))
c1 = threading.Thread(target=Consumer,args=("Dog1",))
c2 = threading.Thread(target=Consumer,args=("Dog2",))

p.start()
c1.start()
c2.start()

执行结果:
生产了骨头1
[Dog1]取到[骨头1]并且吃了它...
生产了骨头2
[Dog2]取到[骨头2]并且吃了它...
生产了骨头3
[Dog1]取到[骨头3]并且吃了它...
生产了骨头4
[Dog2]取到[骨头4]并且吃了它...
生产了骨头5
[Dog1]取到[骨头5]并且吃了它...

## 生产者消费者模型解决了解耦(生产和消费各干各的)、排队的问题(只要生产的资源够,消费者不需要排队)。

--结束END--

本文标题: Python35 events(事件)

本文链接: https://www.lsjlt.com/news/190698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python35 events(事件)
    事件(events) 基于event实现绿灯举例的多线程 程序 import time import threading event = threading.Event() def lighter(): count = 0 ...
    99+
    2023-01-31
    事件 events
  • Android 用户界面---输入事件(Input Events)
    在Android上,输入事件是指用户与设备交互时产生的事件。这些事件可以是触摸屏幕、点击按键、滚动、拖动等操作。Android系统通...
    99+
    2023-09-08
    Android
  • MySQL 使用事件(Events)完成计划任务
    事件可以指定单次或以一定的间隔执行 SQL 代码。通常是将复杂的 SQL 语句使用存储过程封装好,然后周期性地调用存储过程完成一定的任务。 事件无需建立服务端连接,而是通过一个独立的事件调度器线程完成初始化。事件没有...
    99+
    2022-05-15
    MySQL 事件 MySQL 计划任务 MySQL Events
  • Node.js中的events事件模块怎么使用
    本篇内容主要讲解“Node.js中的events事件模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的events事件模块怎么使用”吧...
    99+
    2022-10-19
  • Node.js中的events事件模块知识点总结
    通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。 1. 什么是事件驱动? 事件驱动,简单来说就是...
    99+
    2022-11-12
  • node.js学习之事件模块Events的使用示例
    前言 本文主要给大家介绍了关于node.js事件模块Events使用的一些示例,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 环境:Node v8.2.1; Npm v5.3.0; OS...
    99+
    2022-06-04
    示例 模块 事件
  • Oracle所有诊断事件列表events是怎样的
    Oracle所有诊断事件列表events是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。O...
    99+
    2022-10-19
  • Node.js内置模块events事件监听发射详解
    目录引言事件的监听和发射移除事件监听其它一些方法监听器数量限制获取事件名称和监听器引言 在 vue 的项目中,有时我们会用到全局事件总线来管理组件之间的通信。vue2 项目里我们可...
    99+
    2023-02-17
    Node.js events事件监听发射 Node.js events内置模块
  • mysql事件之修改事件、禁用事件、启用事件、事件重命名及数据库事件迁移操作的示例分析
    这篇文章主要为大家展示了“mysql事件之修改事件、禁用事件、启用事件、事件重命名及数据库事件迁移操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“m...
    99+
    2022-10-18
  • javascript事件冒泡,事件捕获和事件委托详解
    1、事件冒泡:在javascript事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止。并不是所有的事件...
    99+
    2022-11-12
  • 基于事件冒泡、事件捕获和事件委托详解
    事件冒泡、事件捕获和事件委托 在javascript里,事件委托是很重要的一个东西,事件委托依靠的就是事件冒泡和捕获的机制,我先来解释一下事件冒泡和事件捕获: 事件冒泡会从当前触发...
    99+
    2022-11-12
  • js事件流、事件委托与事件阶段实例详解
    目录前言1、事件流2、事件处理程序3、事件对象4、跨浏览器事件处理5、事件委托总结前言 JavaScript 与 HTML 的交互是通过事件实现的,事件代表文档或浏览器窗口中某个有意...
    99+
    2022-11-13
  • js事件流、事件委托与事件阶段的示例分析
    这篇文章主要介绍了js事件流、事件委托与事件阶段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、事件流HTML 中与 javascript 交互是通过事件驱动来实...
    99+
    2023-06-29
  • redis文件事件和时间事件是什么
    今天小编给大家分享一下redis文件事件和时间事件是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2022-10-19
  • 10046事件
    Oracle的10046事件,可以跟踪应用程序所执行的SQL语句,并且得到其解析次数.执行次数,CPU使用时间等信息。这对我们分析、定位数据库性能问题是非常有用的。 10046 event是oracle用...
    99+
    2022-10-18
  • Thinkphp6.0事件
    本节课我们来学习一下要使用一下系统提供的事件。 一.事件 1. 事件和中间件有一点相似,只不过事件更加的精准定位更细腻的业务场景; 2. 事件可定义:事件类、事件监听类、事件订阅类; 3. 我们先创...
    99+
    2023-08-31
    php 服务器 前端
  • Node.js 事件
    Node.js 事件Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。Node.js 里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在...
    99+
    2023-06-03
  • MySQL事件
    文章目录 事件介绍事件调度查询事件调度状态开关事件调度(临时)开关事件调度(永久) 事件使用创建事件语法子句分析执行计划子句事件主体子句 查询事件修改事件删除事件 ...
    99+
    2023-08-20
    mysql 数据库
  • onmouseover事件和onmouseout事件全面理解
    onmouseover事件是指鼠标移动到指定元素上时触发的事件,而onmouseout事件是指鼠标移出指定元素时触发的事件。onmo...
    99+
    2023-08-16
    onmouseover
  • Andriod事件分发事件由来初识
    目录Android事件分发的事件从何而来Activity的事件分发ViewRootImpl事件分发DecorView事件处理Android事件分发的事件从何而来 事件分发一直以来都...
    99+
    2023-03-15
    Android事件分发 Android事件由来
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作