【问题标题】:Python task scheduler without threading没有线程的 Python 任务调度程序
【发布时间】:2021-02-09 13:04:24
【问题描述】:

上下文

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

目标

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

它是如何工作的

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

API_URL/generate_token/MASTER_TOKEN/ACCESS_TIME

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

创建访客令牌后,我对其进行注册并在访问期结束时从threading 添加一个Timer,这将从注册的令牌中删除。

问题

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

替代品

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

scheduler.run()

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

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

【问题讨论】:

    标签: python python-3.x asynchronous scheduled-tasks


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我可能会选择您的最后一个解决方案,这正是我刚刚考虑的,我将检查每个请求的有效性并执行一个“垃圾收集器”线程,该线程将删除定期过期的令牌。我已经为每个令牌附加了到期日期,因此很容易实现!谢谢!
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2021-04-16
    • 2021-04-28
    相关资源
    最近更新 更多