Время внутри цикла - выполнение действия
Нужно каждый 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 шт):
Стандартный таймер 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())
Ну, если оставаться в той же парадигме, то можно просто немного сократить код, упростив логику - просто запоминаете значение секунды, которую вы уже показывали, чтобы не показывать надпись более одного раза:
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
Можно использовать модуль 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 секунд