問題を定義した方法から、これはジェネレーターベースのコルーチンを使用するのに適した状況だと思います。つまり、処理のステップ(または)が終了するたびにmyFunction
ジェネレーターに変更し、時間をチェックするループから実行します。yield
do1
do2
これは、単一の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();
この構造を使用することにはいくつかの利点があります。
- まず、外側のループの
myFunction
どこにあるかを選択できるyield
ので、予期しないときに殺されることはありません。外部データ構造を操作している場合は、すべてが一貫した状態で常に生成されるようにすることができます。
- 第二に、
myFunction
それが有用である場合、中間値を生み出すことができます。上記のサンプルコードはyields None
(からの戻り値somework
ですが、簡単に変更できます。メインループは最新のyield値を_
変数(使用されていません)に入れますが、その変数の名前を変更して、タイムアウトでその値を使用できます必要に応じてブロックします。
GeneratorExit
最後に、例外をキャッチするmyFunction
ことで、シャットダウンする前に必要なクリーンアップコードを実行できます。