43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
import asyncio
|
|
import threading
|
|
|
|
|
|
class Timer(threading.Thread):
|
|
def __init__(self, func=None, args=(), kwargs=None, interval=15, daemon=True):
|
|
threading.Thread.__init__(self, daemon=daemon)
|
|
if kwargs is None:
|
|
kwargs = {}
|
|
self._args = args
|
|
self._kwargs = kwargs
|
|
self._flag = threading.Event()
|
|
self._func = func
|
|
self.interval = interval
|
|
self.task = None
|
|
self.asynchronous = False
|
|
|
|
async def astart(self):
|
|
self.asynchronous = True
|
|
self.task = asyncio.create_task(self.arun())
|
|
await self.task
|
|
|
|
async def arun(self):
|
|
while True:
|
|
await self.atimer()
|
|
await asyncio.sleep(self.interval)
|
|
|
|
async def atimer(self):
|
|
await self._func(*self._args, **self._kwargs)
|
|
|
|
def timer(self):
|
|
self._func(*self._args, **self._kwargs)
|
|
|
|
def run(self):
|
|
while not self._flag.is_set():
|
|
self.timer()
|
|
self._flag.wait(self.interval)
|
|
|
|
def stop(self):
|
|
if not self.asynchronous:
|
|
return self._flag.set()
|
|
self.task.cancel()
|