2010-11-23 23 views
10

Hey. Coğrafi kodlama için Google Haritalar API'sı ile ilgili sorguları içeren bir App Engine uygulaması üzerinde çalışıyorum. Google Haritalar çok fazla istek istemiyor. Bu nedenle, her istekte time.sleep(1) ile 1 saniyelik bir gecikme yapıyorum.App Engine: Kotalarıma doğru saydığım time.sleep() var mı?

benim kotaları benim GAE'nin gösterge tablosunda azaldığında fark ve kısa testi için karar:

import cProfile 
import time 

def foo(): 
    time.sleep(3) 

cProfile.run('foo()') 
bana şu çıktıyı verdi

: o olduğunu söylüyor Yani

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) için 3 CPU saniye tüketiyor. Şimdi, bu gibi çağrıların GAE'nin sağladığı kota sınırlarına sayılıp sayılmadığını merak ediyorum. Ve eğer yaparsa, API arasında geocoding için gecikme yapmanın diğer yolu nedir?

Teşekkürler.

cevap

17

Kesinlikle mümkün mutlak kısa sürede istekleri bitirmek üzere sıfırdan tamamen tasarlanmış bir sistem içinde uyumaya çalışırken olmak istemiyorum: D

Bunun yerine ne olabilir, bir görev oluşturmak olduğunu Her bir coğrafi kod için, (deferred library'a bakın). Bu görev için bir sıra belirtmek istersiniz, ardından geocoder'ın rahat edebileceklerini hissettiğiniz her şey için sıranın hız sınırını ayarlayın.

Bu şekilde, her coğrafi kod çalışır ve asla ayarladığınız hız sınırından daha hızlı olmayacaksınız ve herhangi bir su tesisatı yapmanıza gerek yoktur.

+0

'Sleep' bir hataydı. Teşekkürler!Bunu okuyacaktır;) – kovshenin

+0

@Sudhit +1 güzel yanıt – systempuntoout

+1

@system Teşekkürler ve quizbusters gerçekten çok eğlencelidir: Deffered.deffer için bir giriş olarak geri sayımı kullanan D –

1

Denemeniz, time.sleep zamanının kotanıza uygun olduğunu kanıtlıyor. Deneysel Task Queue API'a bir göz atın. Göreviniz kullanıcı tarafından başlatılmadıysa, Cron görevlerini de kullanabilirsiniz, ancak bunun çok küçük aralıklarla çalışıp çalışmayacağını bilmiyorum.

+0

Aslında görev kuyruğuna her beş dakikada bir görevi ekleyen bir Cron işi kullanıyorum. Ama içindeki görev hala “uyku” için bir çağrı içeriyor. Görevler Yapmayın CPU/s kotalara doğru sayılır mı? Sanırım öyle: http://code.google.com/appengine/docs/python/taskqueue/overview.html#Quotas_and_Limits – kovshenin

+0

Aslında hayır, deney, 'sleep() 'ın kotaya karşı olduğunu kanıtlamaz. Profiler, CPU'nun tüm zamanını işgal ettiği değil, fonksiyona girip çıkmak arasında 3sn sürdüğünü gösteriyor. Öte yandan, kullanılan CPU döngüleri başına Google faturaları (ps/top ile görebildiğiniz gibi) –

2

Kuyruk görevlerinin GAP'ta CPU kullanımınıza da dahil olduğuna kesin olarak eminim. sleep() ile ilgili olarak, bundan CPU "ceza" olacağını sanmıyorum ama bence kötü bir stil.

Neden hiç uyumuyorsunuz? Görevinizde, tek bir coğrafi kodlama yapın ve 3secs'de sıraya başka bir çağrı gönderin. countdown parametresine bakın. http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#add'u çağırırken.

+0

sık sık yaptığım şeydir. –

1

Bu Issue, raporun, time.sleep() tarafından gerçekleşen işlemci saniye için faturalandırılmamış olduğunu, ancak uygulama listelerinde göründüklerini bildirir. Appstats'ın da cprofile kullanması çok olasıdır. Uyku, daha büyük öğeler kümesini geocoding için kullanabileceği daha iyi uyumsuz proxy'ler yapmaya çalışan insanlar için önemlidir.

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