dicen que si tengo cuatro funciones de la siguiente manera:Python: Alternando funciones cada x minutos
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')
Como puedo foo y bar funciones alternativas para ejecutarse cada, digamos 30 minutos? Significado: 1st 30mins - ejecuta foo
, 2nd 30mins - ejecuta bar
, 3rd 30mins - ejecuta foo
, y así sucesivamente. Cada nueva ejecución debería 'matar' al hilo/func anterior.
Tengo un temporizador de cuenta atrás, pero no estoy seguro de cómo 'alternar' las funciones.
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()
EDITAR: Mi solución con entradas de Nicholas Knight ...
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()
funciona bien.
ejecutándose fuera de un hilo limitaría la ejecución de otros códigos? – siva
@siva: Para ser claro, no tenía la intención de "no ejecutarlo en un hilo separado", solo quería decir que estaba complicando demasiado lo que había en el hilo. Envolverlo en una función y lanzarlo en un hilo como lo has hecho está bien. –