Найти - Пользователи
Полная версия: Запуск двух функций по времени
Начало » Python для новичков » Запуск двух функций по времени
1
ajib6ept
Есть две функции func1() и func2(), первая должна работать все время через определенный промежуток времени k, вторая должна запускать только один раз в сутки в примерно установленное время my_time_client

import time, datetime
k = 1
my_time_client = '06:14'
def my_time():
	
	now_time = datetime.datetime.now()
	my_hour = str(now_time.hour)
	my_minute = str(now_time.minute)
	
	if len (my_hour) == 1 : my_hour = '0' + my_hour
	if len (my_minute) == 1 : my_minute = '0' + my_minute
	
	my_time = my_hour + ":"+ my_minute
	return my_time
def func1():
    print 'func1'
def func2():
    print 'func2'
		
while True:
    start = time.time()
    func1()
    if my_time() == my_time_client:
        func2()
    finish = time.time()
    print (k*60-(finish-start))
    time.sleep (k*60-(finish-start))

Когда k=1 проблем нет, если же период установить минут 30 или 40 то возникает проблемы с запуском второй функции; k<60
Например, скрипт начал работать в 06:00, k = 20, т.е. вторая функция никогда не будет выполнена. Как правильно задать условие выполнения?
Lexander
На скриптовых языках нельзя делать планировщики с точным расписанием, т.к. они не обладают достаточной гарантированной точностью.
ajib6ept
Lexander
На скриптовых языках нельзя делать планировщики с точным расписанием, т.к. они не обладают достаточной гарантированной точностью.

А какая возможна погрешность при работе?
Budulianin
Lexander
На скриптовых языках нельзя делать планировщики с точным расписанием, т.к. они не обладают достаточной гарантированной точностью.
ajib6ept
my_hour = str(now_time.hour)
my_minute = str(now_time.minute)
if len (my_hour) == 1 : my_hour = '0' + my_hour
if len (my_minute) == 1 : my_minute = '0' + my_minute
my_time = my_hour + ":"+ my_minute


datetime.datetime.now().strftime('%H:%M')
Lexander
ajib6ept
А какая возможна погрешность при работе?
Она неопределенная.
Заранее нельзя предсказать какой она будет.
Budulianin
ajib6ept
А какая возможна погрешность при работе?

Если надо что-то по расписанию делать, то для этого есть cron
Lexander
Зато с помощью скриптовых языков можно вызывать системные утилиты и настраивать их как угодно.
Внутри программы имеет смысл использовать таймеры до 15 минут.
Все что больше - отдавать на откуп системе.
При этом максимальное время выбирается исходя из объема данных, которые некритично накопить в случае пропуска нескольких точек отсчета.
Например, некритична передача пакета данных на удаленный сервер десятков килобайт раз минуту.
А вот если этих данных мегабайты, то время нужно уменьшать.
ajib6ept
Budulianin
Если надо что-то по расписанию делать, то для этого есть cron

Плодить не хотел; хотел, чтобы все в одном скрипте делалось. Ладно, спасибо за ответы, будем через cron запускать.
bw
Может как-то так:
# python2.7
import sys
import time
import random
def func1(max_work_time=30*60):
    # симуляция работы
    stop_time = time.time() + random.randint(5, max(5, max_work_time))
    while time.time() < stop_time:
        sys.stdout.write('.')
        sys.stdout.flush()
        time.sleep(1)
    print
def func2():
    func1(60)
next_launch_time = None
def shedule_next_launch_time():
    global next_launch_time
    next_launch_time = time.time() + 15*60
while True:
    func1()
    if next_launch_time is None or next_launch_time <= time.time():
        shedule_next_launch_time()
        func2()
    # ...

p.s. Посмотрите ещё в батарейках, там есть `sched`, может сгодится. Я им никогда не пользовался.

..bw
sanodin
когда то так делал
from time import sleep
from datetime import datetime
time_start1 = ('19:54','06:00','20:30','12:45')
time_start2 = ('13:44','03:00','23:30','10:45')
while True:
    d = datetime.today()
    #print d.strftime('%H:%M')
    time_x = d.strftime('%H:%M')
    if time_x in time_start1:
        print "start func_1"
        sleep(59)
    if time_x in time_start2:
        print "start func_2"
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB