Найти - Пользователи
Полная версия: Переодичное выполнение действий
Начало » Python для экспертов » Переодичное выполнение действий
1 2
pochechyev
Здравствуйте,

необходимо выполнять некоторые действия с переодичностью, допустим, раз в 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!!!"
slav0nic
omg, вы же не на bash'e программируете
sched модуль глянь и os.kill

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

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

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

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

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

LA = 200 - насколько я понимаю - это ооочень высокий параметр :/
ZAN
Свой собственный шедулер так или иначе будет сводиться к выполнению бесконечного цикла.
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.
DarkAnthey
Twistеd callLater наше все :)
pochechyev
to lorien: Ваш вариант значительно круче, буду использовать, спасибо.

to ZAN: где почитать про Треды ? как использовать, что дает и т.д. ? спасибо
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