【问题标题】:How to schedule a periodic task in Python?如何在 Python 中安排定期任务?
【发布时间】:2018-05-20 06:12:29
【问题描述】:

如何在 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 小时,然后重置变量,但我想知道是否有更好的选择。

注意:一切都在 docker 中运行。

【问题讨论】:

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


【解决方案1】:

这看起来像是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 时间戳,继续评估自上次读取 (time_now - time_last_read >= 2_HOURS) 以来是否已经 2 小时,然后重新读取值一旦条件为真,进入内存并重置time_last_read

【讨论】:

  • 只是用简单的检查时间方法而不是cron。
  • @utengr 乐于助人。我在问题中添加了 Docker 标记,因为它在这种情况下严重影响了解决方案的选择。
【解决方案2】:

将其放入带有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()

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多