Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中安排周期性任务?_Python_Python 3.x_Docker_Scheduled Tasks - Fatal编程技术网

如何在Python中安排周期性任务?

如何在Python中安排周期性任务?,python,python-3.x,docker,scheduled-tasks,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) 如何在不阻塞的情况下每两小时重置为1 一种方法是启动一

如何在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) 
如何在不阻塞的情况下每两小时重置为1

一种方法是启动一个线程并睡眠2小时,然后重置变量,但我想知道是否有更好的替代方法


注意:一切都在docker中运行。将其放入带有
时间的函数中。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()

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

这看起来像一个用例,一个在所有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中运行此程序的gotchas,您可以通过以下线程->进行操作:

大多数Docker容器只运行您指定的二进制文件(在本例中为/bin/bash),因此没有运行cron守护进程来触发这些作业

有很多方法可以解决这个问题-对于一些小的临时事件,可以将cron条目添加到主机的crontab中,并使用docker exec containername触发容器中的作业

您可以用启动cron的shell脚本替换容器入口点,或者如果您需要多个服务,可以使用类似supervisord的工具来管理它们

如果你要全力以赴,你可以制作一个cron容器,然后你可以用它来启动使用docker exec的任务



另一种方法是你已经拥有的-睡眠2小时,或保持
上次读取时间戳
时间戳,不断评估是否距离上次读取时间已经2小时(
time\u now-time\u last\u read>=2小时
),并在条件为真时将值重新读取到内存中,并重置上次读取的时间。这看起来像是一个用例,在所有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中运行此程序的gotchas,您可以通过以下线程->进行操作:

大多数Docker容器只运行您指定的二进制文件(在本例中为/bin/bash),因此没有运行cron守护进程来触发这些作业

有很多方法可以解决这个问题-对于一些小的临时事件,可以将cron条目添加到主机的crontab中,并使用docker exec containername触发容器中的作业

您可以用启动cron的shell脚本替换容器入口点,或者如果您需要多个服务,可以使用类似supervisord的工具来管理它们

如果你要全力以赴,你可以制作一个cron容器,然后你可以用它来启动使用docker exec的任务



另一种方法是你已经拥有的-睡眠2小时,或保持
上次读取时间戳
时间戳,不断评估是否距离上次读取时间已经2小时(
time\u now-time\u last\u read>=2小时
),一旦条件为真,就将该值重新读取到内存中,并重置上次读取的时间。

可能重复的可能重复,只是使用简单的检查时间方法而不是cron。@utengr很乐意提供帮助。我在问题中添加了Docker标记,因为它严重影响了本例中解决方案的选择。只使用简单的检查时间方法,而不是cron。@utengr很乐意提供帮助。我在问题中添加了Docker标记,因为它严重影响了本例中解决方案的选择。