8

何があっても5秒後に戻る関数を書きたい:

def myfunction():
    while passed_time < 5_seconds:
        do1()
        do2()
        do3()
        .
        .
    return

つまり、この関数は5秒間だけ実行され、5秒後に終了し、他の関数を続行する必要があります。

myfunction()
otherfunction()   ----> This should start 5 seconds after myfunction() is executed.

よろしくお願いします

4

4 に答える 4

5

できるよ:

def myfunction():
    start = time.time()
    while time.time() < start + 5:
        do1()
        do2()
        do3()

これは少なくとも5秒後に停止することに注意してください-、、およびがそれぞれ3秒かかる場合、この関数は9秒かかりますdo1do2do3


これらの呼び出しを遮断したい場合myFunctionは、次のようにすることができます。

def myfunction():
    todo = itertools.cycle([do1, do2, do3])
    start = time.time()
    while time.time() < start + 5:
        todo.next()()

この場合は6秒かかります

于 2012-08-31T14:10:05.483 に答える
3

関数の実行時間がこれらの関数を起動する間隔よりも長い可能性がある場合は、これらの関数を別のスレッドまたはプロセスで開始する必要があります。

threading

import time
import sys
from threading import Thread


def f1():
    print "yo!!"
    time.sleep(6)


def f2():
    print "boring."
    time.sleep(2)


if __name__ == "__main__":
    threads = []
    try:
        for f in [f1, f2]:
            t = Thread(target=f)
            t.start()
            threads.append(t)
            time.sleep(5)
    except KeyboardInterrupt:
        sys.exit(0)
    finally:
        [t.join() for t in threads]

正確に5秒後に1つの関数を強制終了/終了する必要がないという方法で質問を理解しました。主な目標は、5秒間隔で関数を起動することです。一定時間後に関数を「強制終了」する必要がある場合、これはスレッドを使用して簡単ではありません。Pythonでスレッドを強制終了する方法はありますか?

于 2012-08-31T14:22:03.063 に答える
1

次のこともできます。

import time 
start=time.time()   

stuff={1:do1,2:do2,3:do3,...}
i=1

while time.time() <= start+5:
    stuff[i]()
    i+=1
于 2012-08-31T20:42:20.963 に答える
1

問題を定義した方法から、これはジェネレーターベースのコルーチンを使用するのに適した状況だと思います。つまり、処理のステップ(または)が終了するたびにmyFunctionジェネレーターに変更し、時間をチェックするループから実行します。yielddo1do2

これは、単一のsomework関数を繰り返し実行する単純な実装ですが、さまざまな関数を簡単に呼び出すことも、myFunctionジェネレーターで直接作業することもできます。

import time

def somework():
    print "Doing some work!"
    time.sleep(2)

def myFunction():
    try:
        print "Started myFunction()"
        yield somework()
        yield somework()
        yield somework()
        yield somework()
        yield somework()
        print "Done with myFunction()"
    except GeneratorExit:
        print "Exiting myFunction() early!"

def main():
    start = time.time()
    gen = myFunction()
    for _ in gen:
        if time.time() > start+5:
            gen.close();

この構造を使用することにはいくつかの利点があります。

  1. まず、外側のループのmyFunctionどこにあるかを選択できるyieldので、予期しないときに殺されることはありません。外部データ構造を操作している場合は、すべてが一貫した状態で常に生成されるようにすることができます。
  2. 第二に、myFunctionそれが有用である場合、中間値を生み出すことができます。上記のサンプルコードはyields None(からの戻り値someworkですが、簡単に変更できます。メインループは最新のyield値を_変数(使用されていません)に入れますが、その変数の名前を変更して、タイムアウトでその値を使用できます必要に応じてブロックします。
  3. GeneratorExit最後に、例外をキャッチするmyFunctionことで、シャットダウンする前に必要なクリーンアップコードを実行できます。
于 2012-08-31T21:36:48.813 に答える