これは単なるアイデアですが、コメントではなく回答として書く方が簡単です。回避策は、機能を実行するたびに1を上回る状態を設定することです。 1以上の場合は、関数が終了するまで待ってから関数を再実行し、そうでなければ正常に関数を実行してください。
うまくいかない場合は、回答を削除しますが、可能性があります(2回の調整が必要です)。
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)
部分は、最後の部分が次の部分の開始部分と重なっているように見えるだけです。 args
とkwargs
を入力すると、空でもそれを渡すので、あなたの関数でそれらを許可する必要があります。
本体:あなたはそれを使用する方法
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()
理由だけではなく、ブール 'is_playing'をチェックしませんか? –