Какой самый эффективный способ сделать паузу во время цикла в Python? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть скрипт, который перебирает элементы списка. Каждый элемент используется для запроса API. Однако API имеет ограничение на количество запросов (разрешено только 500 запросов в течение 24 часов). В настоящее время я управляю этим с помощью счетчика в цикле, который сбрасывает для каждого «чанка» 500 элементов и приостанавливает цикл на один день. Есть ли лучший способ сделать это?

counter = 0
for query in queries:
    if counter < 500:
        counter = counter + 1
        api = ApiClient(api_key='secretkey')
        data = api.get(q=query)
        print(data)
        safequery = ''.join(e for e in query if e.isalnum())
        datafilename = "{} {}.txt".format(safequery,todaysdate)
        with open(datafilename, 'w') as outfile:
            json.dump(data, outfile)
    else:
        print('sleepy time')
        time.sleep(86400)
        counter = 0

Ответы [ 5 ]

2 голосов
/ 05 ноября 2019

time.sleep(86400) запрашивает проблемы, а также заставляет ваш процессор работать даром. Если что-то случится в течение этих 86400 секунд и сценарий потерпит крах, ничего не будет перезапущено.

Гораздо лучшим вариантом будет сохранение текущей страницы / чанка где-нибудь (необработанный текстовый файл, json, DB, на самом деле невопрос), затем загрузите его перед выполнением следующих запросов.

Затем вы можете поместить свой скрипт в Уровень операционной системы / планировщик управляемых задач (например, cron для Unix или Task Scheduler дляWindows) и запускайте его ежедневно.

0 голосов
/ 05 ноября 2019

Я думаю, вы могли бы сделать этот код в виде сценария Python и выполнить его в пакетном файле.

перехватить этот пакетный файл и запланировать его запуск в диспетчере задач, например, каждый день в 14:00. .

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

0 голосов
/ 05 ноября 2019

Я бы решил эту проблему, создав скрипт, который при запуске получит следующие 500, а затем прекратит работу. Возможно, вы захотите вывести текстовый файл для хранения, где вы находитесь в этой последовательности.

Затем я планировал бы запускать этот скрипт каждые 24 часа с планировщиком задач Windows (в окнах)

Это означает, что у вас нет запущенного процесса, ничего не делающего.

sleep()

следует использовать только для небольших временных интервалов.

0 голосов
/ 05 ноября 2019

time.sleep() - хорошее решение, но вы также можете заставить Python запрашивать ввод, когда хотите продолжить. Это примитивно, я знаю.

if counter % 500 == 0: # make the counter start at 1
        val = input("\nContinue? [y/n]: ")
        if val == 'y':
            pass # manually unpause the looping, whenever you want
        elif val == 'n':
            break # interrupt for loop
0 голосов
/ 05 ноября 2019

Оператор if else со сном, вероятно, так же прост, как и получается;однако он неэффективен, так как процесс все еще будет работать и ничего не делать в течение 86400 секунд.

Вы можете заняться созданием задания cron , чтобы запускать ваш код один день в одно и то же время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...