@037
новичок в программировании

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

Ну собственно говоря, уменя есть скрипт, который выполняет функцию ~каждый час. есть второй, который делает почти то же самое, но каждые ~3часа. оба они исполняются примерно от 5 до 10 минут в зависимости от производительности. я знаю, что делаю все не так и скорее всего должен быть более простой путь, но каждый раз когда они запускаются почти в одно и то же время(примерно раз в 3 часа соответственно). у меня выходит один из двух исходов. либо он задерживает исполнение второго файла, (ну то есть где то на пол часа) что не является приемлимым, либо он просто пропускает ту, которая запускается второй...

как я могу сделать так, чтобы при исполнении одного из скриптов второй как бы все еще вел отсчет, и по его окончанию встал в очередь на исполнение? я долго размышлял стоит ли вообще задавать вопрос, ибо считал, что я где то не догоняю, но в итоге после 10 часов размышлений я все таки сдесь зарегистрировался. любой ответ важен. заранее спасибо ответившим.

UPD
я еще погуглил и написал что-то вроде примера.
import time
import subprocess as sub

s1x= 0         #переменные, которые передаются в другой файл.py и возвращаются обратно для обозначения цикла
s2x= 0

def s1():
    import s1_t       #если я импортирую файл за пределами функции, то он сразу его исполняет
    sub.call(['s1_t.py'])
def s2():
    import s2_t
    sub.call(['s2_t.py'])
    
print('how much s1?')    #должно определяться количество повторов
x=int(input())
y=0

print('how much s2?')
c=int(input())
z=0
print('how much time between s1?')   #время между повторами
t1=input()

print('how much time between s2?')
t2=input()

#if int(t1)==0:
while x>y:
         timing1 = time.time()          #я не могу вспомнить, что это. голова болит уже.  
                                                     #по идее таймер1 и таймер2, которые должны работать один за другим
         while True:
            if time.time() - timing1 > int(t1):
                timing1 = time.time()

                if s1x>0:
                    y+=0
                else:
                    s1()
                    y+=1 

#if int(t2)==0:                
while c>z:
        timing2 = time.time()
        while True:
            if time.time() - timing2 > int(t2):
                timing2 = time.time()
                if s1x>0:
                     z+=0
                else:
                    s2()
                    z+=1

На данный момент есть всего один ньюанс, который заключается в том, что оно не работает от слова совсем.
3 скрипта, один запускает 2 других. я не могу реализовать его до тех пор, пока не напишу для них общий таймер, который будет запускать один файл несколько раз по математической формуле. что наталкивает меня на мысль о том, что должен быть более простой путь (пробовал threading, subprocess, еще была какая то библиотека, но я уже забыл.)
  • Вопрос задан
  • 113 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Под виндой есть штатный Планировщик заданий, который умеет примерно то же что и крон, но настраивается через GUI.

Если ОЧЕНЬ надо - делаешь свой планировщик на базе пакета schedule, только не забудь запустить скрипты в дочернем процессе, например, через subprocess. Но я бы не изобретал велосипед.
Ответ написан
@madsaint7
import threading
import time

def task1():
    print("Выполнение задачи 1")
    # Вместо print() можно вызвать свой скрипт:
    # subprocess.run(["python", "script1.py"])

def task2():
    print("Выполнение задачи 2")
    # subprocess.run(["python", "script2.py"])

def task3():
    print("Выполнение задачи 3")
    # subprocess.run(["python", "script3.py"])

def timer_task(interval, task_func):
    while True:
        task_func()
        time.sleep(interval)

# Создание и запуск потоков для каждой задачи
thread1 = threading.Thread(target=timer_task, args=(10, task1))  # Задача 1 каждые 10 секунд
thread2 = threading.Thread(target=timer_task, args=(20, task2))  # Задача 2 каждые 20 секунд
thread3 = threading.Thread(target=timer_task, args=(30, task3))  # Задача 3 каждые 30 секунд

# Запуск потоков
thread1.start()
thread2.start()
thread3.start()

# Ожидание завершения потоков (если нужно)
thread1.join()
thread2.join()
thread3.join()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
самый простой вариант воспользоваться кроном (cron)
Штатный механизм запуска задач в юниксе.

почитай о формате планирования. сейчас у Вас простой вариант запускать каждый час / каждые три часа
*/1 */3 в поле часов
Пропиши вместо этого запускать со сдвигом и возможно тебе они не нужны круглосуточно
9-23/1
И в поле минут поставь разные значения например 13 и 27
https://firstvds.ru/technology/cron-zapusk-program...
Ответ написан
Комментировать
@037 Автор вопроса
новичок в программировании
пробовал использовать shedule, но это не совсем то, что мне надо. и если честно, то немного оверкилл для того, что я хочу написать.

ну в общем помучался я с математикой и написал рабочую модель формулы, которая определяет соотношение времени ожидания для одного и второго файла и запускает в нужных в соответствующем порядке. хорошо работает с теми временными промежутками, которые не кратны друг другу( 1.3.1.0.)
для использования где-либо этому варианту слишком уж далеко, но как то так.
import time as t
t1 = 15
t2 = 5
re= 3
def eval(x,y,z):                 #функция, запускающая условно что угодно.
    while x >= y:       
        print('executing1')
        print(x,y,z)
        x = x - y
        z -= 1
        t.sleep(y)
    print('executing2')
    print(x,y,z)
    t.sleep(x)
    y = y - x
def slip():
    t.speep(10)

if int(t1)>int(t2):              #структура определения большего числа
        x = t1
        y = t2
if int(t1)<int(t2):
        x = t2
        y = t1

print ('x = '+ str(x))
z = int(x / y)
print(z)                         #коэффициент превышения большего числа

while re>0:
    eval(x,y,z)
    print('cycle')
    re -= 1
    print(x,y,z,re)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы