アプリエンジン:Time.Sleep()は私のクォータに向かってカウントされていますか?
-
27-09-2019 - |
質問
おい。 Google Maps APIへのクエリを含むアプリエンジンアプリに取り組んでいます。 Googleマップはあまりにも多くのリクエストが好きではないので、各リクエストの間に1秒の遅延を置きます time.sleep(1)
.
私の割り当てが私のGaeダッシュボードで低いことに気付き、短いテストを実行することにしました:
import cProfile
import time
def foo():
time.sleep(3)
cProfile.run('foo()')
これにより、次の出力が与えられました。
4 function calls in 3.003 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.003 3.003 <stdin>:1(foo)
1 0.000 0.000 3.003 3.003 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 3.003 3.003 3.003 3.003 {time.sleep}
だから、それは3 cpu秒を消費していると言っています time.sleep(3)
. 。今、私はこのような呼び出しがGAEが提供する割り当て制限にカウントされるかどうか疑問に思っています。もしそうなら、ジオコーディングのAPI呼び出しの間に遅延を行う他の方法は何ですか?
ありがとう。
解決
あなたは確かに、可能な限り短い時間でリクエストを完了するために完全に設計されたシステムで眠ろうとしたくない:D
代わりにできることは、各ジオコードのタスクを作成することです(チェックしてください 繰延ライブラリ)。このタスクのキューを指定してから、キューのレート制限を、GeoCoderが快適であると感じるものに設定するだけです。
これにより、すべてのジオコードが実行され、設定したレート制限よりも速くなることはなく、配管を行う必要はありません。
他のヒント
キュータスクは、ギャップでのCPU使用にもカウントされることをかなり確信しています。それにかんする sleep()
, 、私はそれからCPUの「ペナルティ」があるとは思わないが、それは悪いスタイルだと思う。
なぜまったく眠るのですか?あなたのタスクでは、単一のジオコーディングを行い、3秒のキューに自分自身への別の呼び出しを投稿するだけです。パラメーターを参照してください countdown
呼び出すとき http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#dd .
これ 問題 レポーターは、time.sleep()で発生したCPU秒間請求されていないが、彼らが彼らのappstatに現れると報告しています。 AppStatsもCProfileを使用している可能性が非常に高いです。睡眠は、より大きなアイテムのセットをジオコードするために使用できるより良い非同期プロキシを作ろうとする人々にとって重要です。
http://code.google.com/p/googleappengine/issues/detail?id=3291