如何在Python中安排定期任务?

时间:2017-12-06 11:15:35

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

如何在不阻塞的情况下在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小时然后重置变量,但我想知道是否有更好的替代方案。

注意:所有东西都在码头工具中运行。

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()