Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 24, 2013 14:19:38

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

Есть две функции 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, т.е. вторая функция никогда не будет выполнена. Как правильно задать условие выполнения?



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#2 Ноя. 24, 2013 14:45:55

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

На скриптовых языках нельзя делать планировщики с точным расписанием, т.к. они не обладают достаточной гарантированной точностью.



Офлайн

#3 Ноя. 24, 2013 14:47:37

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

Lexander
На скриптовых языках нельзя делать планировщики с точным расписанием, т.к. они не обладают достаточной гарантированной точностью.

А какая возможна погрешность при работе?



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#4 Ноя. 24, 2013 15:03:15

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

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')



Отредактировано Budulianin (Ноя. 24, 2013 15:03:42)

Офлайн

#5 Ноя. 24, 2013 15:05:56

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

ajib6ept
А какая возможна погрешность при работе?
Она неопределенная.
Заранее нельзя предсказать какой она будет.



Офлайн

#6 Ноя. 24, 2013 15:11:07

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

ajib6ept
А какая возможна погрешность при работе?

Если надо что-то по расписанию делать, то для этого есть cron



Офлайн

#7 Ноя. 24, 2013 15:12:30

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

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



Офлайн

#8 Ноя. 24, 2013 17:49:09

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

Budulianin
Если надо что-то по расписанию делать, то для этого есть cron

Плодить не хотел; хотел, чтобы все в одном скрипте делалось. Ладно, спасибо за ответы, будем через cron запускать.



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#9 Ноя. 24, 2013 18:20:45

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Запуск двух функций по времени

Может как-то так:

# 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



Отредактировано bw (Ноя. 24, 2013 22:06:18)

Офлайн

#10 Ноя. 24, 2013 19:56:35

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Запуск двух функций по времени

когда то так делал

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"

Отредактировано sanodin (Ноя. 24, 2013 19:56:56)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version