当前位置: 首页 > news >正文

Kivy 异步任务

如果要进行一些非常耗时的操作(例如:爬虫等),那么页面就会在这里卡住,而系统就会以为这个软件无响应,并提示关闭,可以说明用户体验极差,因此我们在此处引入异步操作。

        在py中引入事件调节器,并在处理具体业务逻辑的异步方法async def pulse里让程序休眠两分钟。

pythonProject6\MRWord\asynico_task\asynico_insert_date.py

import asyncio
import threading
import logging
from kivy.event import EventDispatcher
class EventLoopWorker(EventDispatcher):# 定义唯一事件__events__ = ('on_pulse',)def __init__(self, file_path, **kwargs):super().__init__(**kwargs)# 制定目标self._thread = threading.Thread(target=self._run_loop)self._thread.daemon = Trueself.loop = Noneself._pulse = Noneself._pulse_task = Noneself.src = file_pathdef _run_loop(self):self.loop = asyncio.get_event_loop_policy().new_event_loop()asyncio.set_event_loop(self.loop)self._restart_pulse()self.loop.run_forever()def start(self):self._thread.start()async def pulse(self):""" 处理具体业务逻辑 """import timelogging.info("Upload is ready, filepath is %s" % self.src)# 休眠两分钟time.sleep(120)logging.info("Upload shutdown")self.__init__(self.src)def _restart_pulse(self):""" 启动或重置任务 """if self._pulse_task is not None:self._pulse_task.cancel()self._pulse_task = self.loop.create_task(self.pulse())def on_pulse(self, *_):""" EventDispatcher 事件必须添加的方法 """pass
0  events = (‘on_pulse’,) 是什么作用,可以删除吗

在这个代码中,__events__ = ('on_pulse',) 是一个类变量,它定义了该类所支持的事件。在这个例子中,EventLoopWorker 类支持一个名为 on_pulse 的事件。

这个类变量的作用是为了方便其他代码使用该类时能够知道可以触发哪些事件。通过定义 __events__ 变量,其他开发者可以清楚地知道该类支持哪些事件,并可以根据需要进行相应的处理。

如果你不需要使用 on_pulse 事件,你可以删除 __events__ = ('on_pulse',) 这行代码。但是请注意,如果其他代码依赖于该事件,删除这行代码可能会导致其他部分的功能出现问题。

1  _pulse 和_pulse_task  是什么

在这个EventLoopWorker类中,_pulse_pulse_task都是实例属性。其中_pulse是一个标记,用于指示工作线程是否应该停止执行任务并退出。而_pulse_task则是定时任务,用于触发on_pulse事件。当_pulse为True时,工作线程会在下一次循环时退出。

在此之前,需要说明一下EventDispatcher是什么。EventDispatcher是一个事件调度器,可以用来注册、分发和处理事件。EventLoopWorker继承了EventDispatcher,并定义了自己的唯一事件on_pulse。在_run_loop方法中,每隔一段时间就会触发on_pulse事件,这个事件会被注册的回调函数所处理。

src是传入的参数,表示工作线程需要处理的目标文件路径。

2  asyncio 是什么

asyncio — Asynchronous I/O — Python 3.12.3 documentation

asyncio是Python的标准库之一,它是一种基于协程的异步IO编程库。通过使用asyncio可以方便地编写高效的异步IO程序,避免了多线程或多进程编程的复杂性和开销。asyncio提供了事件循环、任务、协程、回调、异步IO等功能,可以用于编写高效的网络应用、Web框架、爬虫等。

在上述代码中,asyncio.get_event_loop_policy()获取事件循环的策略,并且创建了一个新的事件循环loop,接着将新的事件循环设置为当前的事件循环,最后启动了事件循环。

asyncio.get_event_loop_policy() 是一个函数,它返回当前事件循环策略的实例。在 asyncio 中,事件循环负责协程的调度和管理,而事件循环策略则是事件循环的实现机制。asyncio.get_event_loop_policy() 返回的是一个策略对象,可以通过该对象创建、获取、设置事件循环。

在默认情况下,asyncio 会使用 asyncio.DefaultEventLoopPolicy() 策略来创建事件循环,但是在某些情况下,我们可能需要使用其他的策略来实现事件循环。

asyncio.get_event_loop_policy()是一个函数,它返回当前事件循环策略的实例。事件循环策略用于管理asyncio事件循环的行为和属性。在Python 3.7之前,asyncio只支持单个事件循环策略,但是在Python 3.7中,可以通过实现自定义事件循环策略来管理多个事件循环。get_event_loop_policy()函数返回的实例可以用于获取和修改事件循环策略的行为和属性。

关于循环策略实例,它通常包含以下属性和方法:

  • asyncioloop:获取当前事件循环策略的事件循环实例。
  • set_event_loop:将指定的事件循环设置为当前循环策略的事件循环。
  • get_child_watcher:获取当前事件循环策略的子进程监视器实例。
  • set_child_watcher:将指定的子进程监视器设置为当前循环策略的子进程监视器。
  • get_exception_handler:获取当前事件循环策略的异常处理函数。
  • set_exception_handler:将指定的异常处理函数设置为当前循环策略的异常处理函数。
  • get_name:获取当前事件循环策略的名称。
3 asyncio.get_event_loop_policy()是一个函数,它返回当前事件循环策略的实例是什么样子的?请给出一个实例参考一下

asyncio.get_event_loop_policy()是一个函数,它返回当前事件循环策略的实例。在Python 3.10中,asyncio的默认策略将更改为ProactorEventLoopPolicy,而在之前的版本中,默认策略为SelectorEventLoopPolicy。

下面是一个使用SelectorEventLoopPolicy策略的示例:

import asyncioloop = asyncio.get_event_loop()
print(type(loop))

输出结果为:

<class 'asyncio.selector_events.SelectorEventLoop'>
 请给出一个使用asyncio.get_event_loop_policy() 的具体案例学习

asyncio.get_event_loop_policy() 是用于获取异步事件循环策略的函数。它返回一个事件循环策略对象,可以使用该对象来创建事件循环。

以下是一个使用 asyncio.get_event_loop_policy() 的具体案例,用于创建异步事件循环和运行协程:

import asyncioasync def coroutine():print('This is a coroutine.')loop = asyncio.get_event_loop_policy().get_event_loop()
loop.run_until_complete(coroutine())

上面的代码中,我们定义了一个协程 coroutine(),然后通过 asyncio.get_event_loop_policy() 获取了默认的事件循环策略对象,并使用 get_event_loop() 方法创建了事件循环。最后,通过调用 run_until_complete() 方法运行协程。

4 loop.create_task()

create_task() 是 asyncio 包中的一个方法,用于创建一个协程任务并将其添加到事件循环中。该方法的作用是将协程转化为一个 task 对象,并加入到事件循环中,使其被调度运行。

在你提供的代码中,create_task() 方法用于创建一个协程任务并将其添加到事件循环中,其中 self.pulse() 是一个协程函数,用于进行心跳检测。这样就可以通过 asyncio 事件循环的机制,自动运行心跳检测协程。

需要注意的是,使用 create_task() 方法创建的任务是非阻塞的,即异步执行,不会阻塞当前线程。同时,在协程运行完成后,会自动返回一个 future 对象,可以通过该对象获取协程运行的结果或状态。

5 loop.call_soon()

loop.call_soon() 是 asyncio 的一个方法,用于将一个回调函数添加到事件循环中。当事件循环运行时,该回调函数会被执行。它的作用是将任务放入事件循环中,等待事件循环调度执行。此方法返回一个 asyncio.Handle 对象,它可以用来取消该回调函数的执行。

具体来说,当我们想要在 asyncio 中执行一些异步操作时,可以使用 loop.call_soon() 方法将这些操作封装成一个协程,然后添加到事件循环中。一旦事件循环开始运行,这些协程就会按照添加的顺序依次执行。

举个例子,如果我们想要在 asyncio 中发起一个 HTTP 请求,可以使用 aiohttp 库提供的异步请求方法,并将其封装成一个协程。然后使用 loop.call_soon() 方法将该协程添加到事件循环中,等待事件循环调度执行。

6 loop.call_later

loop.call_later() 是 Python 中 asyncio 的方法之一,它允许您安排在指定时间之后执行的回调函数。具体来说,它将在事件循环中安排一个定时器,并在定时器触发时执行指定的回调函数。

使用 loop.call_later() 可以很方便地处理一些需要在一段时间之后才能处理的任务,例如在等待某些资源可用时进行轮询。

下面是使用 loop.call_later() 的一个简单示例:

import asyncioasync def hello():print("Hello")await asyncio.sleep(1)print("World")def say_hello_later(loop):loop.create_task(hello())loop = asyncio.get_event_loop()
loop.call_later(2, say_hello_later, loop)
loop.run_forever()

以上代码将会在 2 秒钟后输出 “Hello”,然后等待 1 秒钟再输出 “World”。

Event Loop — Python 3.12.3 documentation

        loop.call_later() 的执行顺序如何保证?

在 Python 的 asyncio 模块中,loop.call_later() 是一种在指定时间后调用指定函数的方式。它的执行顺序是由事件循环机制来保证的,即当我们使用 loop.call_later() 注册一个任务时,事件循环会将该任务放到一个任务队列中。然后,事件循环会不断地从任务队列中获取任务并执行,直到队列为空或者事件循环被关闭。

需要注意的是,loop.call_later() 注册的任务并不会立即执行,而是在指定的时间后才会执行。如果多个任务的执行时间相同,则它们的执行顺序是随机的,但是如果它们的执行时间不同,则会按照执行时间从小到大的顺序执行。

7 loop = asyncio.get_event_loop()

loop = asyncio.get_event_loop() 是一个创建一个事件循环的方法。asyncio是Python中用于异步编程的库,它提供了一种基于事件循环的异步模型,能够帮助我们更加高效地处理I/O密集型任务。在使用asyncio时,我们需要创建一个事件循环,然后将任务添加到事件循环中执行,通过future对象来获取任务的执行结果。get_event_loop() 方法就是用来创建事件循环的,它会返回当前线程的事件循环实例,如果当前线程没有事件循环实例,则会自动创建一个。一般来说,在使用asyncio时都需要先创建一个事件循环,再将任务添加到事件循环中执行。

8 threading.Thread.start()

threading.Thread.start() 是 Python 中的一个方法,它用于启动一个新的线程,并让这个线程开始执行。这个方法会在后台创建一个新的线程,并调用线程的 run() 方法,在这个方法中定义线程要执行的任务。

需要注意的是,start() 方法只能在一个 Thread 实例中调用一次,否则会抛出 RuntimeError 异常。

以下是一个简单的示例:

import threadingdef my_func():print("Hello, world!")my_thread = threading.Thread(target=my_func)
my_thread.start()
9  self._pulse_task.cancel() 中.cancle()

cancel() 方法用于取消一个正在进行的任务。在本例中,self._pulse_task.cancel() 方法用于取消正在进行的 _pulse_task 任务,以便能够重新启动或重置任务。当任务被取消时,它不会再继续执行,并且会返回一个布尔值,表明任务是否已经被取消。如果任务尚未执行,那么它将不会被执行,也不会返回任何值。需要注意的是,一旦任务被取消,它就不能再次被启动或者执行。

相关文章:

Kivy 异步任务

如果要进行一些非常耗时的操作(例如&#xff1a;爬虫等)&#xff0c;那么页面就会在这里卡住&#xff0c;而系统就会以为这个软件无响应&#xff0c;并提示关闭&#xff0c;可以说明用户体验极差&#xff0c;因此我们在此处引入异步操作。 在py中引入事件调节器&#xff0c;并在…...

DEV--C++小游戏(吃星星(0.1))

目录 吃星星&#xff08;0.1&#xff09; 简介 头文件 命名空间变量 副函数 清屏函数 打印地图函数 移动函数 主函数 0.1版完整代码 吃星星&#xff08;0.1&#xff09; 注&#xff1a;版本<1为未实现或只实现部分 简介 用wasd去吃‘*’ 头文件 #include<bi…...

LINUX 入门 4

LINUX 入门 4 day6 7 20240429 20240504 耗时&#xff1a;240min 课程链接地址 第4章 LINUX环境编程——实现线程池 C基础 第3节 #define里面的行不能乱空行&#xff0c;要换行就打\ typedef 是 C 和 C 中的一个关键字&#xff0c;用于为已有的数据类型定义一个新的名字。…...

Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl

本文首发于公众号&#xff1a;机器感知 Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl You Only Cache Once: Decoder-Decoder Architectures for Language Models We introduce a decoder-decoder architecture, YOCO, for large language models, …...

Java Collections.emptyList() 方法详解

前言 在Java开发的日常中&#xff0c;我们常常需要处理集合数据结构&#xff0c;而这其中就免不了要面对“空集合”的场景。传统的做法可能是直接返回 null&#xff0c;但这往往会引入空指针异常的风险&#xff0c;降低了代码的健壮性。幸运的是&#xff0c;Java为我们提供了一…...

Vue前端环境准备

vue-cli Vue-cli是Vue官方提供的脚手架&#xff0c;用于快速生成一个Vue项目模板 提供功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境&#xff1a;NodeJs 安装NodeJs与Vue-Cli 1、安装nodejs&#xff08;已经安装就不用了&#xff09; node-…...

代码随想录算法训练营第四十二天| 01背包问题(二维、一维)、416.分割等和子集

系列文章目录 目录 系列文章目录动态规划&#xff1a;01背包理论基础①二维数组②一维数组&#xff08;滚动数组&#xff09; 416. 分割等和子集①回溯法&#xff08;超时&#xff09;②动态规划&#xff08;01背包&#xff09;未剪枝版剪枝版 动态规划&#xff1a;01背包理论基…...

故障——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题纯数学&#xff0c;考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…...

SSD存储基本知识

存储技术随着时间的推移经历了显著变化&#xff0c;新兴的存储介质正逐步挑战已经成为行业标准的硬盘驱动器&#xff08;HDD&#xff09;。在众多竞争者中&#xff0c;固态硬盘&#xff08;SSD&#xff09;是最广泛采用且最有潜力占据主导地位的——它们速度快、运行安静&#…...

buuctf-misc题目练习二

ningen 打开题目后是一张图片&#xff0c;放进winhex里面 发现PK&#xff0c;PK是压缩包ZIP 文件的文件头&#xff0c;下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离&#xff0c;或者识别当前的文件是什么文件。比如拓展名被删除、被附加…...

Nginx rewrite项目练习

Nginx rewrite练习 1、访问ip/xcz&#xff0c;返回400状态码&#xff0c;要求用rewrite匹配/xcz a、访问/xcz返回400 b、访问/hello时正常访问xcz.html页面server {listen 192.168.99.137:80;server_name 192.168.99.137;charset utf-8;root /var/www/html;location / {root …...

2024,AI手机“元年”? | 最新快讯

文 | 伯虎财经&#xff0c;作者 | 铁观音 2024年&#xff0c;小米、荣耀、vivo、一加、努比亚等品牌的AI手机新品如雨后春笋般涌现。因此&#xff0c;这一年也被业界广泛视为AI手机的“元年” 试想&#xff0c;当你轻触屏幕&#xff0c;你的手机不仅响应你的指令&#xff0c;更…...

5月9(信息差)

&#x1f30d; 可再生能源发电量首次占全球电力供应的三成 &#x1f384;马斯克脑机接口公司 Neuralink 计划将 Link 功能扩展至现实世界&#xff0c;实现控制机械臂、轮椅等 马斯克脑机接口公司 Neuralink 计划将 Link 功能扩展至现实世界&#xff0c;实现控制机械臂、轮椅等…...

leetcode203-Remove Linked List Elements

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&…...

2024付费进群系统,源码及搭建变现视频课程(教程+源码)

自从我做资源站项目盈利稳定后&#xff0c;我越来越对网站类项目感兴趣了&#xff0c;毕竟很多网站类项目还是需要一定技术门槛的&#xff0c;可以过滤掉一些人&#xff0c;很多新人做项目就只盯着短视频&#xff0c;所以网站类项目也就没那么的卷。 这个付费进群系统&#xf…...

深入理解Django:中间件与信号处理的艺术

title: 深入理解Django&#xff1a;中间件与信号处理的艺术 date: 2024/5/9 18:41:21 updated: 2024/5/9 18:41:21 categories: 后端开发 tags: Django中间件信号异步性能缓存多语言 引言 在当今的Web开发领域&#xff0c;Django以其强大的功能、简洁的代码结构和高度的可扩…...

rk3588局域网推流

最近无意间看见在网上有使用MediaMtx插件配合ffmpeg在Windows来进行推流&#xff0c;然后在使用其他软件进行拉流显示数据图像的&#xff0c;既然windows都可以使用 &#xff0c;我想linux应该也可以&#xff0c;正好手上也有一块RK3588的开发板&#xff0c;就测试了一下&#…...

Android虚拟机机制

目录 一、Android 虚拟机 dalvik/art&#xff08;6版本后&#xff09;二、Android dex、odex、oat、vdex、art区别 一、Android 虚拟机 dalvik/art&#xff08;6版本后&#xff09; 每个应用都在其自己的进程中运行&#xff0c;都有自己的虚拟机实例。ART通过执行DEX文件可在设…...

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…...

ChatPPT开启高效办公新时代,AI赋能PPT创作

目录 一、前言二、ChatPPT的几种用法1、通过在线生成2、通过插件生成演讲者模式最终成品遇到问题改进建议 三、ChatPPT其他功能 一、前言 想想以前啊&#xff0c;为了做个PPT&#xff0c;我得去网上找各种模板&#xff0c;有时候还得在某宝上花钱买。结果一做PPT&#xff0c;经…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...