如何在不阻塞的情况下在python中安排定期任务?
这是一个简单的情况。假设此票证变量在2小时后变为无效。所以我需要从服务器上获取它,但是,我只是保持简单。
ticket = 1 # It expires every 2 hours
def process_using_ticket(): # This function is called using a get request from flask server
print('hello', ticket)
如何在不阻塞的情况下每两小时重置一次?
一种方法可能是启动线程并休眠2小时然后重置变量,但我想知道是否有更好的替代方案。
注意:所有东西都在码头工具中运行。
答案 0 :(得分:3)
这看起来像cron
的一个用例,这是一个在所有Linux机器上发现的用于安排定期任务的简单实用程序。可以创建一个简单的 cron 任务,如:
$ crontab -e
在cron中,输入一个条目
0 */2 * * * /home/username/ticket_script.py
确保您的脚本具有可执行权限。如果您在脚本中打印某些内容,请使用cron条目重定向其输出,如
0 */2 * * * /home/username/ticket_script.py >> /home/username/ticket_script_runs.log
对于在Docker中运行此问题的问题,您可以浏览此主题 - > https://forums.docker.com/t/cronjobs-in-docker-container/2618/5说:
大多数Docker容器只运行您指定的二进制文件(在本例中为/ bin / bash),因此没有运行cron守护程序来触发这些作业。
有很多方法可以解决这个问题 - 对于小的特殊情况,您可以将cron条目添加到主机的crontab中,并使用docker exec containername来触发容器中的作业...
您可以使用启动cron的shell脚本替换容器入口点,或者如果您需要多个服务,请使用supervisord之类的东西来管理它们。
如果你全押,你可以制作一个cron容器,然后你可以使用它来启动使用docker exec的任务。
另一种方法是你已经拥有的 - 进入睡眠状态2小时,或者保持time_last_read
时间戳,继续评估自上次阅读后是否已经过了2小时(time_now - time_last_read >= 2_HOURS
),然后重新开始 - 一旦条件为True,将值读入内存并重置time_last_read
。
答案 1 :(得分:1)
将其放在time.sleep(7200000)
的函数中。像这样:
import time
ticket = 1
def main_loop():
while True:
time.sleep(7200000)
ticket = 1
def process_using_ticket():
print('hello', ticket)
main_loop()