Вызовите функцию Python для определенных временных отметок - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь отправить запрос в API каждую минуту, потому что API обновляет свои данные каждую минуту, и я хочу, чтобы обновленные данные немедленно.Очень важно, чтобы время было очень точным, в конце я хочу все запустить непрерывно.

Это смутно то, что я пытаюсь сделать:

import time, sched

time = 1549667056000  # starting timestamp

def get_data():  # function to get some data from the API via requests
    #gets the Data

while true:
    s.scheduler(time)
    s.run(get_data())  # gets the data on the specified time(stamp)
    time = time + 60000  # adds 1 minute to the timestamp

Должен ли я сделать это такКстати, или есть ли еще более умный способ получать данные из REST Api ровно каждую полную минуту?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Спасибо всем за помощь.

Этот ответ сработал для меня очень хорошо в конце концов:

import time
starttime = time.time()
while True:
  print(time.time())
  time.sleep(60.0 - ((time.time() - starttime) % 60.0))

Я позволил ему бежать всю ночь, тамне было смены сверхурочно.Время между выполнениями составляет ровно 60, независимо от того, сколько времени занимает выполнение кода в цикле.

0 голосов
/ 09 февраля 2019

Вы можете использовать asyncio.sleep

Для Python <3,7 </p>

import asyncio

def get_data():
    print("Getting data")

async def main():
    while true:
        get_data()
        await asyncio.wait(MINUTE)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Для Python 3,7 +

import asyncio

def get_data():
    print("Getting data")

async def main():
    while true:
        get_data()
        await asyncio.wait(60)

#This is the only thing that changes
asyncio.run(main)

edit

Согласно вашему комментарию, если вы действительно беспокоитесь о том, чтобы этот вызов вызывался каждые 60 секунд.

Вы могли бы реализовать способ потратить время до get_dataвызывается и вычитается из 60, просто нужно убедиться, что get_data занимает более 60 секунд, чтобы ждать 0 секунд или нет вовсе.

Что-то вроде этого для вашего main() должно работать:

#make sure to:
import time

async def main():
    while true:
        t = time.time()
        get_data()
        time_diff = int(time.time() - t)
        await asyncio.wait(max(60 - time_diff, 0))
...