python - 没有线程的 Python 任务调度程序
问题描述
语境
我目前正在做一个 API 类,基于fastapi
它能够管理访问时间的令牌访问。
客观的
我想在访问期结束时自动从授权令牌列表中删除令牌。
它是如何工作的
我有一个主令牌,可用于随时通过给定路径生成来宾令牌。还必须根据此格式向 API 提供特定时间:
API_URL/generate_token/MASTER_TOKEN/ACCESS_TIME
这将返回一个新的访客令牌,其访问周期为给定的“access_time”值。
创建来宾令牌时,我对其进行注册并在访问期结束时添加一个计划,这将从注册的令牌中删除该令牌Timer
。threading
问题)
我不想通过计时器为每个新的访客令牌创建一个新的“线程”,因为我希望主线程永久拥有优先级。而且我担心如果我有很多来宾令牌,由于所有线程的优先级交换,API 会很慢。
备择方案
我想到了sched
图书馆。但这提出了一个问题,即在我们启动之前创建的调度程序之前,必须定义所有计划任务
scheduler.run()
问题是可以随时创建和注册新的访客令牌。所以我不知道如何正确处理它。
任何帮助或研究轨迹将不胜感激。
解决方案
每个令牌没有计时器是明智的。
任何帮助或研究轨迹将不胜感激。
有一个线程负责删除过期的令牌,否则将其休眠?取决于您需要多少精度(sleep
不提供超精确的唤醒保证)。
在 POSIX 上,您也可以使用 SIGALRM ( signal.alarm
),通常编写信号处理程序很复杂,但 IIRC Python 会做自己的事情。
或者,只需将有效性信息附加到令牌,并检查当请求进入时,可能偶尔会“收获”一次(例如每小时或每天),该收获是否会是一个单独的线程(在计时器上)或其他)或只是对其中一个请求的打击。
推荐阅读
- r - R 如何处理不明确的列名?
- hyperledger - composer-rest-server 未处理的“错误”事件
- python - 按来自另一个数据框python的列更改数据框列名称
- odata - 如何在 OData 调用中排除多个值?
- docker - Nodemon 和 Docker 的“错误:找不到模块”,即使安装了卷
- java - 在 Anylogic 中使用 Java - 如何将变量字符串转换为类型“TargetLine”
- regex - 获取匹配模式perl的所有出现
- java - 我可以将 Spring WebFlux 应用程序部署为 WAR
- google-cloud-platform - 在谷歌云计算引擎上使用 smtp.gmail.com 和 465 端口从 php 发送电子邮件
- java - Tomcat 不调用控制器 api