2

我花了很多时间搜索类似的东西,但我认为我没有使用正确的搜索词。无论如何,我有一些我想在一天中的特定时间执行的任务,这些任务可以通过 python-api 执行。

有没有我可以使用的模块/方法来确保这些任务在正确的时间运行,并确保没有任务被跳过?如果我自己写一些东西,它看起来会非常难看:

import sys
import time

taskA = False
taskB = False
taskC = False

while True:
    now = time.strftime("%H:%M:%S")

    if taskA == False and now >= "10:00:00":
        <do TaskA>
        taskA = True
    if taskB == False and now >= "12:00:00":
        <do TaskB>
        taskB = True
    if taskC == False and now >= "16:20:07":
        <do TaskC>
        taskC = True
        sys.exit(0)

    time.sleep(1)

这是目前在 cron 上的东西,但我想用 python 脚本替换它。

4

2 回答 2

1

IIUC:这是一个简单的解决方案,您可以使用包中的threading.Timer函数,该函数threading启动一个线程,该线程在指定的时间间隔过后执行一个函数。你可以使用这个:

from threading import Timer
from datetime import datetime, date
from time import sleep

def task_a():
    sleep(5) #--> perform some work
    print("Task A, completed at:", datetime.today().time())

def task_b():
    sleep(10) #--> perform some work
    print("Task B, completed at", datetime.today().time())

def task_c():
   sleep(20) #--> perform some work
   print("Task C, completed at", datetime.today().time())

now = datetime.today().time()

taska_start = datetime.strptime("10:00:00", "%H:%M:%S").time()
taskb_start = datetime.strptime("12:00:00", "%H:%M:%S").time()
taskc_start = datetime.strptime("16:20:07", "%H:%M:%S").time()

tasks = [(taska_start, task_a), (taskb_start, task_b), (taskc_start, task_c)]

for task_start, task in tasks:
    if datetime.combine(date.min, task_start) > datetime.combine(date.min, now):
        diff = datetime.combine(date.min, task_start) > datetime.combine(date.min, now)
        t = Timer(diff.seconds, task)
        t.start()

例如,

如果当前时间12:00:00和假设task_a计划在 运行13:00:00task_b计划在 运行,13:30:00task_c计划在 14:00:00.. 运行。然后执行脚本task_a后将在60几秒task_b后运行,将在 之后运行90task_c并将在120从当前时间开始的几秒后运行。

样本结果:

Task A, completed at: 13:00:05
Task B, completed at: 13:30:10
Task C, completed at: 14:00:20
于 2020-04-05T05:44:41.183 回答
0

您可以使用 CRON 作业。Python Crontab 允许你做这样的事情。您可以在此处查看如何使用它:https ://stackabuse.com/scheduling-jobs-with-python-crontab/

于 2020-04-05T06:04:14.437 回答