Python: чередующиеся функции каждые x минут
Скажите, есть ли у меня четыре функции, как показано ниже:
def foo():
subprocess.Popen('start /B someprogramA.exe', shell=True)
def bar():
subprocess.Popen('start /B someprogramB.exe', shell=True)
def foo_kill():
subprocess.Popen('taskkill /IM someprogramA.exe')
def bar_kill():
subprocess.Popen('taskkill /IM someprogramB.exe')
Как я могу чередовать функции foo и bar для запуска каждый, скажем, 30 минут?
Значение: 1st 30mins - run foo
, 2nd 30mins - run bar
, 3rd 30mins - run foo
и т.д. Каждый новый запуск должен "убивать" предыдущий поток /func.
У меня есть потоки таймера обратного отсчета, но не знаю, как "чередовать" функции.
class Timer(threading.Thread):
def __init__(self, minutes):
self.runTime = minutes
threading.Thread.__init__(self)
class CountDownTimer(Timer):
def run(self):
counter = self.runTime
for sec in range(self.runTime):
#do something
time.sleep(60) #editted from 1800 to 60 - sleeps for a minute
counter -= 1
timeout=30
c=CountDownTimer(timeout)
c.start()
РЕДАКТИРОВАТЬ: Мое решение с входами Николаса Найт...
import threading
import subprocess
import time
timeout=2 #alternate delay gap in minutes
def foo():
subprocess.Popen('start /B notepad.exe', shell=True)
def bar():
subprocess.Popen('start /B calc.exe', shell=True)
def foo_kill():
subprocess.Popen('taskkill /IM notepad.exe')
def bar_kill():
subprocess.Popen('taskkill /IM calc.exe')
class Alternator(threading.Thread):
def __init__(self, timeout):
self.delay_mins = timeout
self.functions = [(foo, foo_kill), (bar, bar_kill)]
threading.Thread.__init__(self)
def run(self):
while True:
for f, kf in self.functions:
f()
time.sleep(self.delay_mins*60)
kf()
a=Alternator(timeout)
a.start()
Прекрасно работает.
Ответы
Ответ 1
Вы слишком сильно себя чувствуете.
while True:
foo()
time.sleep(1800)
foo_kill()
bar()
time.sleep(1800)
bar_kill()
Или, если вы хотите легко добавить дополнительные функции позже:
functions = [(foo, foo_kill), (bar, bar_kill), ] # Just append more as needed
while True:
for f, kf in functions:
f()
time.sleep(1800)
kf()
Ответ 2
Помните, что функции являются первоклассными объектами в Python. Это означает, что вы можете хранить их в переменных и контейнерах! Один из способов сделать это:
funcs = [(foo, foo_kill), (bar, bar_kill)]
def run(self):
counter = self.runTime
for sec in range(self.runTime):
runner, killer = funcs[counter % 2] # the index alternates between 0 and 1
runner() # do something
time.sleep(1800)
killer() # kill something
counter -= 1
Ответ 3
Используйте переменную для записи той функции, которую вы запускали в последний раз. Когда таймер срабатывает, запустите другую функцию и обновите переменную.
Ответ 4
import itertools, time
# make sure the function are in the order you want to run them in
# and grouped by the ones that you want to run together
funcs = ((bar_kill, foo), (foo_kill, foo))
for func_killer, func in itertools.cycle(funcs)
func_killer()
func()
time.sleep(30 * 60) # pause for 30 minutes
Функция может быть сохранена в списках в питонах, и вы можете повторять их с помощью цикла for
.
itertools
- это модуль для обработки итераций, таких как списки. Здесь мы используем cycle
для создания цикла бесконечности, который будет обрабатывать функции в списке funcs
снова и снова.