如何在Python中安排周期性任务?
如何在python中安排周期性任务而不阻塞 这里有一个简单的情况。假设此票证变量在2小时后变为无效。所以我需要从发球局拿球如何在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 一种方法是启动一
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标记,因为它严重影响了本例中解决方案的选择。