不带线程的Python任务调度器
上下文 我目前正在做一个基于不带线程的Python任务调度器,python,python-3.x,asynchronous,scheduled-tasks,Python,Python 3.x,Asynchronous,Scheduled Tasks,上下文 我目前正在做一个基于fastapi的API类,它将能够根据访问时间管理令牌访问 目标 我想在访问期结束时自动从授权令牌列表中删除令牌 工作情况如何 我有一个主令牌,可用于通过给定路径随时生成来宾令牌。还必须根据以下格式向API提供特定时间: API\u URL/生成\u令牌/主\u令牌/访问\u时间 这将返回一个新的来宾令牌,其访问周期为给定的“访问时间”值 创建来宾令牌后,我将其注册,并在访问期结束时从线程中添加计时器,该计时器将从注册令牌中删除令牌 问题 我不想通过计时器为每个新的来
fastapi
的API类,它将能够根据访问时间管理令牌访问
目标
我想在访问期结束时自动从授权令牌列表中删除令牌
工作情况如何
我有一个主令牌,可用于通过给定路径随时生成来宾令牌。还必须根据以下格式向API提供特定时间:
API\u URL/生成\u令牌/主\u令牌/访问\u时间
这将返回一个新的来宾令牌,其访问周期为给定的“访问时间”值
创建来宾令牌后,我将其注册,并在访问期结束时从线程中添加计时器,该计时器将从注册令牌中删除令牌
问题
我不想通过计时器为每个新的来宾令牌创建一个新的“线程”,因为我希望主线程具有永久的优先级。我担心的是,如果我有很多来宾令牌,那么由于所有线程的优先级交换,API会慢很多
备选方案
我想到了sched
库。但是这一个提出了一个问题,即在我们使用该行启动先前创建的调度程序之前,必须定义所有计划任务
scheduler.run()
问题是,可以随时创建和注册新的来宾令牌。所以我不知道如何正确处理它
任何帮助或研究都将不胜感激。每个令牌没有计时器是明智的
任何帮助或研究都将不胜感激
是否有一个线程负责删除过期的令牌,或者将其休眠?取决于您需要的精确度(sleep
不提供超精确的唤醒保证)
在POSIX上,您还可以使用SIGALRM(signal.alarm
),通常编写信号处理程序很复杂,但IIRC Python有自己的功能
或者,只需将有效性信息附加到令牌上,并检查当请求传入时,可能每隔一段时间(例如,每小时或每天)进行一次“收获”,该收获是否是一个单独的线程(在计时器上或任何东西上)或只是对其中一个请求的点击。我可能会选择您最后的解决方案,这就是我刚才想的,我将检查每个请求的有效性,并执行一个“垃圾收集器”线程,该线程将删除定期过期的令牌。我已经在每个代币上附上了到期日期,所以它很容易实现!非常感谢。