Фоновый цикл Python при запуске других команд

Я работаю над мини-игрой irl, где вы получаете материалы каждые 5 минут. Чтобы отслеживать это, я хотел написать простой python script. Но теперь есть небольшой дорожный знак,

как вы создаете цикл, который делает что-то каждые x минут, все еще запуская другие входы клавиатуры, не прерывая цикл?

Ответ 1

Возможно, таймер будет полезен для вашей задачи. Я рекомендую вам проверить эту ссылку: https://docs.python.org/2.4/lib/timer-objects.html. Пока таймер подсчитывает, вы можете выполнять другие задачи, и когда время увеличивается, вы можете прикрепить функцию к таймеру, чтобы что-то сделать. Таймеры из этой библиотеки наследуют от Threads

Ответ 2

Вот довольно простой пример использования threading.Timer. Он отображает текущее время каждые 5 секунд, реагируя на ввод пользователя.

Этот код будет запускаться на любом терминале, который поддерживает последовательные escape-последовательности ANSI/VT100.

#!/usr/bin/env python3

''' Scrolling Timer

    Use a threading Timer loop to display the current time
    while processing user input

    See https://stackoverflow.com/q/45130837/4014959

    Written by PM 2Ring 2017.07.18
'''

import readline
from time import ctime
from threading import Timer

# Some ANSI/VT100 Terminal Control Escape Sequences
CSI = '\x1b['
CLEAR = CSI + '2J'
CLEAR_LINE = CSI + '2K'
SAVE_CURSOR = CSI + 's'
UNSAVE_CURSOR = CSI + 'u'
GOTO_LINE = CSI + '%d;0H'

def emit(*args):
    print(*args, sep='', end='', flush=True)

# Show the current time in the top line using a Timer thread loop
def show_time(interval):
    global timer
    emit(SAVE_CURSOR, GOTO_LINE % 1, CLEAR_LINE, ctime(), UNSAVE_CURSOR)
    timer = Timer(interval, show_time, (interval,))
    timer.start()

# Set up scrolling, leaving the top line fixed
emit(CLEAR, CSI + '2;r', GOTO_LINE % 2)

# Start the timer loop
show_time(interval=5)

try:
    while True:
        # Get user input and print it in upper case
        print(input('> ').upper())
except KeyboardInterrupt:
    timer.cancel()
    # Cancel scrolling
    emit('\n', SAVE_CURSOR, CSI + '0;0r', UNSAVE_CURSOR)

Вам нужно отправить KeyboardInterrupt, то есть нажать Ctrl C, чтобы остановить эту программу,