如果要进行一些非常耗时的操作(例如:爬虫等),那么页面就会在这里卡住,而系统就会以为这个软件无响应,并提示关闭,可以说明用户体验极差,因此我们在此处引入异步操作。
在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 = True
self.loop = None
self._pulse = None
self._pulse_task = None
self.src = file_path
def _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 time
logging.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是Python的标准库之一,它是一种基于协程的异步IO编程库。通过使用asyncio可以方便地编写高效的异步IO程序,避免了多线程或多进程编程的复杂性和开销。asyncio提供了事件循环、任务、协程、回调、异步IO等功能,可以用于编写高效的网络应用、Web框架、爬虫等。
在上述代码中,asyncio.get_event_loop_policy()获取事件循环的策略,并且创建了一个新的事件循环loop,接着将新的事件循环设置为当前的事件循环,最后启动了事件循环。