非阻塞式定时器 apscheduler

在Django中,views.py主要用于处理HTTP请求并返回响应。为了确保定时任务不会干扰到HTTP请求的处理,你需要将定时任务的执行与请求处理分离。下面是如何在views.py中实现这一点,并确保定时任务不会阻塞请求处理流程的一些示例。

# views.py
import time, json
from apscheduler.schedulers.background import BackgroundScheduler
from app_demo.tasks import *


# 采用非阻塞的方式
scheduler = BackgroundScheduler()
scheduler.add_job
在Python中,不影响进程的定时器通常指非阻塞式定时器,以下介绍几种常见的实现方法: ### 使用`threading.Timer` `threading.Timer` 可以在指定时间后执行一个函数,且不会阻塞主线程。示例代码如下: ```python import threading def print_message(): print("定时器触发,5秒时间到!") timer = threading.Timer(5, print_message) timer.start() print("主线程继续执行其他操作") ``` ### 使用`APScheduler`库 `APScheduler` 是一个强大的任务调度库,提供了多种调度器,其中 `BackgroundScheduler` 可在后台运行,不影响主线程。使用前需要先安装该库:`pip install apscheduler`。示例代码如下: ```python from apscheduler.schedulers.background import BackgroundScheduler import time def job(): print("定时器触发,执行任务") scheduler = BackgroundScheduler() scheduler.add_job(job, 'interval', seconds=5) scheduler.start() try: while True: time.sleep(1) except (KeyboardInterrupt, SystemExit): scheduler.shutdown() ``` ### 自定义非阻塞定时器类 可以自定义一个非阻塞定时器类,结合线程实现。示例代码如下: ```python import threading import time class RepeatedTimer(object): def __init__(self, interval, function, *args, **kwargs): self._timer = None self.interval = interval self.function = function self.args = args self.kwargs = kwargs self.is_running = False self.next_call = time.time() self.start() def _run(self): self.is_running = False self.start() self.function(*self.args, **kwargs) def start(self): if not self.is_running: self.next_call += self.interval self._timer = threading.Timer(self.next_call - time.time(), self._run) self._timer.start() self.is_running = True def stop(self): self._timer.cancel() self.is_running = False def hello(name): print(f"Hello {name}!") rt = RepeatedTimer(5, hello, "World") try: while True: time.sleep(1) except (KeyboardInterrupt, SystemExit): rt.stop() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值