Pergunta

Ei. Estou trabalhando em um aplicativo de mecanismo de aplicativos que envolve consultas na API do Google Maps para geocodificação. O Google Maps não gosta de muitos pedidos, então eu coloquei um atraso de 1 segundo entre cada solicitação com time.sleep(1).

Percebi que minhas cotas estão em baixo no meu painel GAE e decidi fazer um teste curto:

import cProfile
import time

def foo():
    time.sleep(3)

cProfile.run('foo()')

O que me deu a seguinte saída:

   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}

Então diz que está consumindo 3 segundos de CPU para um time.sleep(3). Agora estou me perguntando se chamadas como essas são contadas para os limites da cota que o GAE oferece. E se isso acontecer, qual é a outra maneira de fazer atrasos entre as chamadas de API para geocodificação?

Obrigado.

Foi útil?

Solução

Você certamente não quer estar tentando dormir em um sistema que foi projetado completamente desde o início para terminar os pedidos no menor tempo possível: D

O que você poderia fazer é criar uma tarefa para cada geocódigo (confira o Biblioteca diferida). Você deseja especificar uma fila para esta tarefa e, em seguida, definir o limite de taxa na fila para o que você sentir que o geocoder de mapas pode se sentir confortável.

Dessa forma, todo geocódigo será executado e você nunca será mais rápido que o limite de taxa definido e não precisa fazer nenhum encanamento.

Outras dicas

Estou bastante certo de que as tarefas da fila também contam para o seu uso da CPU no GAP. Em relação a sleep(), acho que não haverá "penalidade" da CPU, mas acho que é um estilo ruim.

Por que dormir? Em sua tarefa, faça uma única geocodificação e simplesmente publique outra invocação para si mesmo na fila em 3segs. Veja o parâmetro countdown Ao invocar http://code.google.com/intl/el/elpgengine/docs/python/taskqueue/functions.html#add .

Seu experimento prova que o tempo. Dê uma olhada no experimental API da fila de tarefas. Se sua tarefa não for iniciada pelo usuário, você também pode usar Cron Tarefas, mas não sei se isso funcionará bem com intervalos tão pequenos.

este Questão Relatos de que o repórter não foi cobrado por segundos de CPU incorridos pelo time.sleep (), mas que eles aparecem em seus AppStats. É muito provável que o AppStats também use o CProfile. O sono é importante para as pessoas que tentam fazer melhores proxies assíncronos que ele poderia usar para geocodificar um conjunto maior de itens.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top