Quem espera semprecansaChamadas assíncronas ao Datastore Plus
As coisas que você deveriasaber•toplevels/tasklets•futures•yield (você vai fazer muitos generators)•você vai usar raise em...
Como se faziaclass Fact(model.Model):    text = model.TextProperty()    rating = model.FloatProperty(default = 400.)    ra...
Digressão: _ah/stats•Um bom jeito de entender o desempenho de suas aplicações•Se você estiver fazendo algo errado, vai fic...
Como o código anterior secomporta
… e no servidor
O jeito assíncronofutures = []for i in range(10):    futures.append(Fact(text = Fact %d %         i).put_async())[ f.get_r...
_ah/stats
No servidor
Fazendo melhor:toplevel/tasklet@context.toplevel(decorando algo que vai chamar o tasklet abaixo) @tasklets.taskletdef init...
… ainda melhor@context.toplevel(decorando o que chama o tasklet)@tasklets.taskletdef init_facts()     Futures = []     for...
ab -n 10000 -c 50 (síncrono)Connection Times (ms)              min  mean[+/-sd] median   maxConnect:      140  159  69.1  ...
ab -n 10000 -c 50(assíncrono)Connection Times (ms)              min  mean[+/-sd] median   maxConnect:      140  669 1375.6...
Qual a diferença?
Erradofor f in Fact.query():   f.rating = random.normalvariate(400, 20)   f.put()
Porque errado?
Certo: map_async@tasklets.taskletdef randomize_rating(f):  f.rating = random.normalvariate(400, 20)  raise tasklets.Return...
Certo: map_async
O que mais eu precisosaber?•context e seu event loop•caches•novos tipos de dados•novos nomes para os tipos conhecidos•repe...
Onde eu encontro?•Builds oficiais•http://code.google.com/p/appengine-ndb-experiment/downloads/list•"Bleeding" edge•hg clon...
Para saber mais•Documentação: http://code.google.com/p/appengine-ndb-experiment/•Google Group: http://groups.google.com/gr...
AgradecimentosAgradecimentos são devidos ao pessoal do grupo appengine-ndb-discuss,em especial ao Guido e ao Vladimir, que...
Upcoming SlideShare
Loading in …5
×

Quem espera sempre cansa

2,591 views
2,276 views

Published on

Apresentação feita na Pythonbrasil[7], em setembro de 2011, sobre a API assíncrona de acesso a dados do Google App Engine

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,591
On SlideShare
0
From Embeds
0
Number of Embeds
733
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Quem espera sempre cansa

  1. 1. Quem espera semprecansaChamadas assíncronas ao Datastore Plus
  2. 2. As coisas que você deveriasaber•toplevels/tasklets•futures•yield (você vai fazer muitos generators)•você vai usar raise em vez de return (às vezes)•não são threads•..._async•a API de query mudou•Um uso insanamente legal de override de comparadores
  3. 3. Como se faziaclass Fact(model.Model):    text = model.TextProperty()    rating = model.FloatProperty(default = 400.)    random_index = model.ComputedProperty(        lambda self : random.randint(0,            sys.maxint))(...)for i in range(10):    Fact(text = Fact %d % i).put()
  4. 4. Digressão: _ah/stats•Um bom jeito de entender o desempenho de suas aplicações•Se você estiver fazendo algo errado, vai ficar óbvioFácil de ligar no app.yaml:builtins:(...)- appstats: on
  5. 5. Como o código anterior secomporta
  6. 6. … e no servidor
  7. 7. O jeito assíncronofutures = []for i in range(10):    futures.append(Fact(text = Fact %d %         i).put_async())[ f.get_result() for f in futures ] Dá a oportunidade de agregar os puts em uma grande operação com odatastore (sem que tenhamos que nos preocupar muito com isso)
  8. 8. _ah/stats
  9. 9. No servidor
  10. 10. Fazendo melhor:toplevel/tasklet@context.toplevel(decorando algo que vai chamar o tasklet abaixo) @tasklets.taskletdef init_facts()  futures = []  for i in range(10):    futures.append(Fact(text = Fact %d %       i).put_async())  yield futures Yield permite que o event loop do toplevel gerencie generators que estejam esperando por umaresposta do servidor
  11. 11. … ainda melhor@context.toplevel(decorando o que chama o tasklet)@tasklets.taskletdef init_facts() Futures = [] for i in range(10): futures.append(Fact(text = Fact %d % i).put_async()) raise tasklets.Return(futures)Porque quando você retorna o último resultado de um iterador, você deve lançar uma exceção
  12. 12. ab -n 10000 -c 50 (síncrono)Connection Times (ms)              min  mean[+/-sd] median   maxConnect:      140  159  69.1    145     976Processing:   338 7408 5452.2   6231   46247Waiting:      338 7407 5452.2   6230   46247Total:        482 7567 5442.4   6377   46401Percentage of the requests served within a certain time (ms)  50%   6377  66%   8540  75%  10131  80%  11068  90%  13419  95%  16077  98%  23883  99%  30173 100%  46401 (longest request)
  13. 13. ab -n 10000 -c 50(assíncrono)Connection Times (ms)              min  mean[+/-sd] median   maxConnect:      140  669 1375.6    151   21193Processing:   189  338 300.0    256   15320Waiting:      189  335 243.7    255    4143Total:         332 1007 1407.6    438   21450Percentage of the requests served within a certain time (ms)  50%    438  66%    565  75%    732  80%   1272  90%   3372  95%   3456  98%   3762  99%   9366 100%  21450 (longest request)
  14. 14. Qual a diferença?
  15. 15. Erradofor f in Fact.query(): f.rating = random.normalvariate(400, 20) f.put()
  16. 16. Porque errado?
  17. 17. Certo: map_async@tasklets.taskletdef randomize_rating(f):  f.rating = random.normalvariate(400, 20)  raise tasklets.Return(f.put_async())@context.topleveldef randomize_all():  Fact.query().map_async(randomize_rating)
  18. 18. Certo: map_async
  19. 19. O que mais eu precisosaber?•context e seu event loop•caches•novos tipos de dados•novos nomes para os tipos conhecidos•repeated = True•StructuredProperty, LocalStructuredProperty•compress•tempos de resposta mais curtos e melhor uso das instâncias
  20. 20. Onde eu encontro?•Builds oficiais•http://code.google.com/p/appengine-ndb-experiment/downloads/list•"Bleeding" edge•hg clone https://code.google.com/p/appengine-ndb-experiment/•Versão 0.7 foi lançada ontem
  21. 21. Para saber mais•Documentação: http://code.google.com/p/appengine-ndb-experiment/•Google Group: http://groups.google.com/group/appengine-ndb-discuss/
  22. 22. AgradecimentosAgradecimentos são devidos ao pessoal do grupo appengine-ndb-discuss,em especial ao Guido e ao Vladimir, que sugeriram assuntos e meapontaram na direção certa.

×