2011-02-01 1 views
3

Google App EngineのPythonバージョンではシグナルモジュールがサポートされていないため、メソッドが2秒以内に返されない場合は、メソッドを呼び出して例外をスロー/キャッチする最も簡単な方法は何でしょうか?PythonバージョンのGoogle App Engineで特定のメソッドの実行時間をどのように制限できますか?

+0

サポートされていないドキュメントはどこにも表示されません。あなたは何かを見つけましたか、それを使用しようとしましたが、それをインポートすると空のモジュールが得られることに気付きましたか? –

答えて

4

あなたは、このようなデータストアとしてRPC呼び出し、話をしている場合は、期限(create_rpcを参照)とのRPCを作成することができ、データストア機能(db.getdb.put、等...)、その後、キャッチにRPCを渡しますDeadlineExceededErrors

# Set a five-second timeout 
rpc = db.create_rpc(deadline=5) 

# A query: 
query = YourModel.all().fetch(100, rpc=rpc) 

URLFetchfetch機能も期限のパラメータを取ります。

独自のコードについては、timeモジュールを参照してください。

+0

ありがとうございます。 RPCタイムアウト機能は多くの場合役に立ちますが、呼び出すメソッドがクエリまたはデータストア関数の完了を待たずにタイムアウト例外をスローするにはどうすればよいですか?わかりやすい例として、私が呼び出すメソッドが無限ループに陥るとしましょう。 – Chris

+0

@Chris、あなたは '開始時間'を保存し、それを現在の時間と比較することによって基本的なチェックを行うために、時間モジュールを使用することができました。何らかの限界を過ぎると、ループから抜け出す(または関数から戻るなど)。 –

+0

もう一度ありがとうございます。私は別のURLを取得することは実用的なアプローチに終わると思います。フェッチされたURLでメソッドを実行し、フェッチを行うメソッドでURLFetchデッドラインを使用するだけです。 – Chris

0

ループでは、ループが開始された時間を保存し、各繰り返しでどのくらいの時間が経過しているかを確認できます。

ではなく、ループ内でになっていれば、ややこしいことです。数行のコードごとに時間チェックビットを追加することができます。これはもちろん、実際には醜いコードになりますが、バックグラウンドでタイマーを実行して実行中のコードを中断させるスレッドを生成する能力がなければ、周りにはあまり道はありません。