Время внутри цикла - выполнение действия

Нужно каждый 10 секунд делать определенное действие в цикле (в данном случае делаю print('yes')). Мне кажется код выглядит не очень красиво, сложно и безграмотно. Как можно улучшить и записать код который ниже, сохранив while True: try: и давая результат каждый 10 секунд. Почему я именно так делал - time.sleep(0.1) должно остаться именно таким, поэтому когда придет нужное время, print('yes') пропечатается много раз, пока не закончилась 1 секунда - от сюда и такое решение с temp_after

while True:
    
    try:

        time.sleep(0.1) 

        if datetime.now().second in [1,10,20,30,40,50]:

            if temp_after == 0:
                print('yes')
                temp_after = 1

        if datetime.now().second in [2,11,21,31,41,51]:
            temp_after = 0  

Ответы (3 шт):

Автор решения: eri

Стандартный таймер https://docs.python.org/3/library/threading.html#timer-objects

import time
import threading

def hello():
    print('yes')
    threading.Timer(10.0, hello).start()

hello()

while True:
    time.sleep(0.1) 

или асинхронщина c колбэком

import asyncio

def tensec():
    asyncio.get_running_loop().call_later(10, tensec)
    print('yes')

async def main():
    loop = asyncio.get_running_loop()
    loop.call_soon(tensec)
    while True:
        await loop.run_in_executor(None, time.sleep, 0.1)


asyncio.run(main())

или с таском

import asyncio

async def tensec():
    while True:
        print('yes')
        await asyncio.sleep(10)

async def main():
    asyncio.create_task(tensec())
    loop = asyncio.get_running_loop()
    while True:
        await loop.run_in_executor(None, time.sleep, 0.1)


asyncio.run(main())
→ Ссылка
Автор решения: CrazyElf

Ну, если оставаться в той же парадигме, то можно просто немного сократить код, упростив логику - просто запоминаете значение секунды, которую вы уже показывали, чтобы не показывать надпись более одного раза:

import time
from datetime import datetime

last_time = None
while True:
    
    try:
        time.sleep(0.1) 
        time_now = datetime.now().second
        if time_now in [1,10,20,30,40,50] and last_time != time_now:
            print('yes')
            last_time = time_now  
  
    except Exception:
        pass
→ Ссылка
Автор решения: coder737

Можно использовать модуль schedule.

pip install schedule

import schedule

def main():
    print("hello")
if __name__ == "__main__":
    schedule.every(10).seconds.do(main)
    while True:
        schedule.run_pending()

Действия в main будет повторятся постоянно каждые 10 секунд

→ Ссылка