Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2009 18:13:21

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

Здравствуйте,

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

что можете предложить ?
идеальное решение должно потреблять минимальное колличество ресурсов.

я реализовал (естественно неправильно и криво) так:

our_time=time.localtime().tm_min
while 1:
if our_time % 2:
uptime=os.system("uptime > uptime_res.txt")
file=open('uptime_res.txt','r')
regexp=re.compile("\d\.\d\d").search(file.read())
la=regexp.group(0)
print la
if float(la)>=200:
os.system("killall -9 apache2")
print "FUCK!!!"



Отредактировано (Фев. 11, 2009 18:13:50)

Офлайн

#2 Фев. 11, 2009 19:22:35

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

omg, вы же не на bash'e программируете
sched модуль глянь и os.kill

код достоет места в wtf_code ;)

Офлайн

#3 Фев. 11, 2009 19:23:38

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

Фак май моск ))

Я бы посоветовал для начала отказаться от бесконечного цикла и воспользоваться кроном что бы запускать скрипт с переодичностью раз в две минуты..



Отредактировано (Фев. 11, 2009 19:37:18)

Офлайн

#4 Фев. 11, 2009 20:56:36

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

cron это конечно хорошо, только когда у серва LA больше 200 cron скрипт может и не запустить, а вот если он будет запущен уже это совсем другой разговор.

а по поводу os.kill - он убивает один процесс, мне нужно все. просто так мне кажется быстрее чем сначала искать пиды всех апачей и по очереди их убивать, если неправ - обьясните

за sched спасибо, буду пользовать.

ЗЫ: бесконечный цикл нужен был чтобы выразить важность задачи :)))))))))))



Отредактировано (Фев. 11, 2009 21:04:02)

Офлайн

#5 Фев. 11, 2009 22:48:32

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

pochechyev
cron это конечно хорошо, только когда у серва LA больше 200 cron скрипт может и не запустить
Что значит LA?



Офлайн

#6 Фев. 11, 2009 23:34:05

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

ZAN
pochechyev
cron это конечно хорошо, только когда у серва LA больше 200 cron скрипт может и не запустить
Что значит LA?
прошу прощения.
если вкратце то LA это общая загруженность сервера, подробнее здесь http://en.wikipedia.org/wiki/Load_(computing)



Офлайн

#7 Фев. 12, 2009 00:21:57

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

Теперь понял oad verage из uptime - нужно было глянуть код в начале ветки.
Спасибо

LA = 200 - насколько я понимаю - это ооочень высокий параметр :/



Отредактировано (Фев. 12, 2009 00:47:50)

Офлайн

#8 Фев. 12, 2009 01:07:15

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

Свой собственный шедулер так или иначе будет сводиться к выполнению бесконечного цикла.

while 1:
#put your code here
time.sleep(timeout)
На самом деле такой вариант вполне уместен для не-мультитредингового приложения. В предолженном вами варианте разве что отсутствует time.sleep - без него скрипт попытается использовать максимум ресурсов.

Если же треды нужны, то код следует слегка модифицировать.
while event.isSet():
#put your code here
event.wait(timeout)
Event - это, естесственно, экземпляр класса Event из модуля threading.
В принципе, для первого случая, как уже писал slav0nic, есть модуль sched, для второго - threading.Timer.

Для того, чтобы избежать чтения/записи данных во временный файл, нужно воспользоваться пайпами. Т.е. вместо os.system(“uptime > uptime_res.txt”) использовать os.popen либо модуль subprocess.



Офлайн

#9 Фев. 12, 2009 13:16:25

DarkAnthey
От:
Зарегистрирован: 2008-07-22
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

Twistеd callLater наше все :)



Офлайн

#10 Фев. 13, 2009 11:05:14

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Переодичное выполнение действий

to lorien: Ваш вариант значительно круче, буду использовать, спасибо.

to ZAN: где почитать про Треды ? как использовать, что дает и т.д. ? спасибо



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version