Ответ 1
Простое решение
import threading
def work ():
threading.Timer(0.25, work).start ()
print "stackoverflow"
work ()
Вышеописанное будет гарантировать, что work
будет выполняться с интервалом четыре раза в секунду, теория позади этого заключается в том, что он "поставит в очередь" вызов самому себе, который будет запущен на 0.25 секунды в будущее, без зависания ожидая, что это произойдет.
Из-за этого он может работать (почти) полностью без прерывания, и мы очень близки к выполнению функции ровно 4 раза в секунду.
Подробнее о threading.Timer
можно прочитать, следуя приведенной ниже ссылке на документацию python:
РЕКОМЕНДУЕТСЯ] Более продвинутое/динамическое решение
Несмотря на то, что предыдущая функция работает так, как ожидалось, вы можете создать вспомогательную функцию, которая поможет справляться с будущими событиями времени.
Что-то, как показано ниже, будет достаточным для этого примера, надеюсь, что код будет говорить сам за себя - он не настолько продвинут, как может показаться.
Смотрите это как вдохновение, когда вы можете реализовать свою собственную упаковку в соответствии с вашими точными потребностями.
import threading
def do_every (interval, worker_func, iterations = 0):
if iterations != 1:
threading.Timer (
interval,
do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1]
).start ()
worker_func ()
def print_hw ():
print "hello world"
def print_so ():
print "stackoverflow"
# call print_so every second, 5 times total
do_every (1, print_so, 5)
# call print_hw two times per second, forever
do_every (0.5, print_hw)