59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
import logging
|
|||
|
|
import secrets
|
||
|
|
|
||
|
|
from apscheduler.executors.pool import ThreadPoolExecutor
|
||
|
|
from apscheduler.schedulers.blocking import BlockingScheduler
|
||
|
|
from apscheduler.triggers.interval import IntervalTrigger
|
||
|
|
from django.conf import settings
|
||
|
|
|
||
|
|
# 配置日志
|
||
|
|
logging.basicConfig(level=logging.INFO)
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class DingShiQi:
|
||
|
|
def __init__(self):
|
||
|
|
# ✅ 实例属性:每个实例独立
|
||
|
|
self.ding_id = secrets.token_hex(12)
|
||
|
|
# 注册 executors
|
||
|
|
executors = {
|
||
|
|
'my_executor': ThreadPoolExecutor(max_workers=1, ),
|
||
|
|
'you_executor': ThreadPoolExecutor(max_workers=1),
|
||
|
|
}
|
||
|
|
# 使用 BlockingScheduler(会阻塞)
|
||
|
|
self.scheduler = BlockingScheduler(timezone=settings.TIME_ZONE, executors=executors)
|
||
|
|
|
||
|
|
def task任务(self):
|
||
|
|
print("任务执行了啦") # 或 logger.info("任务执行了啦")
|
||
|
|
|
||
|
|
def triggerIntervalTrigger触发器(self) -> IntervalTrigger:
|
||
|
|
return IntervalTrigger(seconds=3)
|
||
|
|
|
||
|
|
def 添加任务(self):
|
||
|
|
self.scheduler.add_job(
|
||
|
|
func=self.task任务,
|
||
|
|
id=self.ding_id,
|
||
|
|
trigger=self.triggerIntervalTrigger触发器(),
|
||
|
|
name="xiaozizi",
|
||
|
|
max_instances=1,
|
||
|
|
misfire_grace_time=1,
|
||
|
|
coalesce=True,
|
||
|
|
executor="my_executor", # 在这里可以选择线程池的名称
|
||
|
|
)
|
||
|
|
|
||
|
|
def startTask(self):
|
||
|
|
logger.info("Starting scheduler...")
|
||
|
|
try:
|
||
|
|
self.scheduler.start() # ⚠️ 这里会阻塞!
|
||
|
|
except KeyboardInterrupt:
|
||
|
|
logger.info("Stopping scheduler...")
|
||
|
|
self.scheduler.shutdown()
|
||
|
|
logger.info("Scheduler shut down successfully!")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
print("TIME_ZONE:", settings.TIME_ZONE)
|
||
|
|
ding = DingShiQi()
|
||
|
|
ding.添加任务()
|
||
|
|
ding.startTask() # ← 会阻塞在这里,每3秒打印一次 "任务执行了啦"
|