10

おい。私は、ジオコーディングのために Google Maps API へのクエリを含む App Engine アプリに取り組んでいます。Google マップはリクエストが多すぎるのを好みません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}

したがって、time.sleep(3). このような呼び出しが、GAE が提供するクォータ制限にカウントされるかどうか疑問に思っています。もしそうなら、ジオコーディングのための API 呼び出し間で遅延を発生させる別の方法は何ですか?

ありがとう。

4

4 に答える 4

17

可能な限り最短時間でリクエストを完了するようにゼロから完全に設計されたシステムでスリープ状態にしようとしないでください:D

代わりにできることは、ジオコードごとにタスクを作成することです (遅延ライブラリを確認してください)。このタスクのキューを指定してから、キューのレート制限を、マップ ジオコーダーが快適に使用できると思われるものに設定します。

この方法では、すべてのジオコードが実行され、設定したレート制限よりも速くなることはなく、配管を行う必要もありません。

于 2010-11-23T10:03:50.100 に答える
2

キュー タスクも GAP の CPU 使用量にカウントされることは確かです。に関してsleep()は、それによるCPUの「ペナルティ」はないと思いますが、スタイルが悪いと思います。

なぜまったく眠るのですか?あなたのタスクでは、単一のジオコーディングを行い、3 秒で別の呼び出しをキューに投稿するだけです。パラメータcountdownWhen invoking http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#addを参照してください。

于 2010-11-23T11:00:26.523 に答える
1

この問題は、レポーターが time.sleep() によって発生した CPU 秒に対して請求されていないが、appstats に表示されることを報告しています。appstats も cprofile を使用する可能性が非常に高いです。スリープは、アイテムのより大きなセットをジオコーディングするために使用できる、より優れた非同期プロキシを作ろうとしている人々にとって重要です。

http://code.google.com/p/googleappengine/issues/detail?id=3291

于 2010-11-24T21:10:30.543 に答える
1

あなたの実験は、time.sleep 時間が割り当てに対してカウントされることを証明しています。実験的なTask Queue API をご覧ください。タスクがユーザーによって開始されない場合は、Cronタスクを使用することもできますが、これが非常に短い間隔でうまく機能するかどうかはわかりません。

于 2010-11-23T09:56:23.197 に答える