Python: чередование функций каждые х минут - PullRequest
10 голосов
/ 23 мая 2011

Скажите, если у меня есть четыре функции, как показано ниже:

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 минут? Значение: первые 30 минут - запустить foo, вторые 30 минут - запустить bar, третьи 30 минут - запустить 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()

Работает нормально.

Ответы [ 4 ]

10 голосов
/ 23 мая 2011

Помните, что функции являются первоклассными объектами в 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
6 голосов
/ 23 мая 2011

Вы слишком усложняете это.

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 голосов
/ 23 мая 2011

Используйте переменную, чтобы записать, какую функцию вы запускали в прошлый раз.Когда таймер сработает, запустите другую функцию и обновите переменную.

1 голос
/ 23 мая 2011
Функция
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 снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...