首页 > 解决方案 > 没有线程的 Python 任务调度程序

问题描述

语境

我目前正在做一个 API 类,基于fastapi它能够管理访问时间的令牌访问。

客观的

我想在访问期结束时自动从授权令牌列表中删除令牌。

它是如何工作的

我有一个主令牌,可用于随时通过给定路径生成来宾令牌。还必须根据此格式向 API 提供特定时间:

API_URL/generate_token/MASTER_TOKEN/ACCESS_TIME

这将返回一个新的访客令牌,其访问周期为给定的“access_time”值。

创建来宾令牌时,我对其进行注册并在访问期结束时添加一个计划,这将从注册的令牌中删除该令牌Timerthreading

问题)

我不想通过计时器为每个新的访客令牌创建一个新的“线程”,因为我希望主线程永久拥有优先级。而且我担心如果我有很多来宾令牌,由于所有线程的优先级交换,API 会很慢。

备择方案

我想到了sched图书馆。但这提出了一个问题,即在我们启动之前创建的调度程序之前,必须定义所有计划任务

scheduler.run()

问题是可以随时创建和注册新的访客令牌。所以我不知道如何正确处理它。

任何帮助或研究轨迹将不胜感激。

标签: pythonpython-3.xasynchronousscheduled-tasks

解决方案


每个令牌没有计时器是明智的。

任何帮助或研究轨迹将不胜感激。

有一个线程负责删除过期的令牌,否则将其休眠?取决于您需要多少精度(sleep不提供超精确的唤醒保证)。

在 POSIX 上,您也可以使用 SIGALRM ( signal.alarm),通常编写信号处理程序很复杂,但 IIRC Python 会做自己的事情。

或者,只需将有效性信息附加到令牌,并检查当请求进入时,可能偶尔会“收获”一次(例如每小时或每天),该收获是否会是一个单独的线程(在计时器上)或其他)或只是对其中一个请求的打击。


推荐阅读