Python:如何仅在第一个任务结束时运行第二个任务

时间:2016-05-12 10:00:19

标签: python

一旦使用Raspberry Pi检测到运动,我正在开发一个带有默认音频播放的运动检测器。

然而,当检测到连续动作时,下一个音频将开始播放并在前一个音频尚未结束时开始重叠。

我可以在python中实现任何循环吗?

目前,我正在使用带有音频总长度的定时器循环,然后再播放另一个音频。但我相信有更好的解决方案。有什么想法吗?

#!/usr/bin/python

import sched, time
s = sched.scheduler(time.time, time.sleep)
def do_something(sc):
    print "Doing stuff..."
    # do your stuff
    sc.enter(10, 1, do_something, (sc,))

s.enter(10, 1, do_something, (s,))
s.run()

1 个答案:

答案 0 :(得分:0)

这只是一个想法,但更容易写作答案而不是评论。解决方法可能是设置一个状态,每次运行该函数时它都高1。如果它超过1,请等到函数结束,然后再次运行该函数,否则只需正常运行该函数。

如果它不起作用我将删除答案,但我认为它可能会做(虽然可能会进行一些调整)。

import sched, time
s = sched.scheduler(time.time, time.sleep)
state = 0

def do_something(sc):
    global state

    #increase the state, and cancel if it's over 1 (already running)
    state += 1
    if state > 1:
        return

    original_state = state
    print "Doing stuff..."
    # do your stuff
    sc.enter(10, 1, do_something, (sc,))

    #Run again if the state has changed during the function
    if original_state != state:
        s.run()
        state -= 1
    state -= 1

编辑:制作我自己的功能似乎有效。它在后台执行,并使用状态构思将它们排队。 time.sleep(0.01)部分只是因为结尾似乎与下一个的开头重叠。使用argskwargs,即使它是空的,它也会传递它们,所以你必须在你的函数中允许它们。

主要部分:

import time
from threading import Thread

class ThreadHelper(Thread):
    def __init__(self, function, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs
        Thread.__init__(self)
        self.function = function

    def run(self):
        self.function(*self.args, **self.kwargs)

def run_once(func, *args, **kwargs):
    global state

    state[0] += 1
    original_state = state[0]

    if state[0] > 1:
        return

    func(*args, **kwargs)
    time.sleep(0.01)

    while state[0] != original_state:
        state[0] -= 1
        func(*args, **kwargs)
        time.sleep(0.01)

    state[0] -= 1

你如何使用它:

def dosomething(*args, **kwargs):
    print 'start'
    time.sleep(0.5)
    print 'end'

state = [0]
ThreadHelper(run_once, dosomething, _state=state).start()
ThreadHelper(run_once, dosomething, _state=state).start()
ThreadHelper(run_once, dosomething, _state=state).start()