Procrastinando com Celery.adriano petrich petrich@gmail.com #TDC2011
O que é o Celery?
Ponto forte do Celery • Gerenciador de tarefas assíncrono
Ponto forte do Celery    • Gerenciador      de          tarefas      assíncrono    • Distribuído entre máquinas
Os dois pontos fortesdo Celery    • Gerenciador      de          tarefas      assíncrono    • Distribuído entre máquinas
Os dois pontos fortesdo Celery    • Gerenciador      de          tarefas      assíncrono    • Distribuído entre máquinas  ...
CeleryDentre os pontos fortes do Celerydestacam-se      • Gerenciador     de        tarefas        assíncrono      • Distr...
Como Funciona?
Resposta Curta
.
Resposta Longa
EstruturaTarefaPublicadoresFilaTrabalhadores/Consumidores
Tarefa
Tarefafrom celery.task import task@taskdef foo(val):    return val
Publicador
PublicadoresSincronamente >>> foo(5) 5
PublicadoresAssincronamente >>> res = foo.delay(5)
Dois Jeitos# não bloqueia>>> res.ready()True ou False>>> res.result5# ou bloqueia>>> res.get()5
Fila
FilaBackend sugerido é o RabbitMQ(todas as crianças legais do bairro usamerlang)
Mas também suportaRedisBeanstalkMongoDBCouchDBe bancos suportados pelo ORM do Django
Trabalhador
TrabalhadorPode estar rodando em outra máquinaCada Worker process ainda pode usarvários threads
Trabalhador$ celeryd$ ./manage celeryd
Por que?
Web ou StandAlone?
WebPainel de Escalabilidade (djangocon.eu)http://2011.djangocon.eu/talks/47/
Problemas comunsWhat are the common mistakes you see.--------------------------------------Things that take a long time ("...
Processos demoradosentopem os tubes
Soluções comunsTenha um celery de criança:Scaling wise, what should you think about before scalingbecomes an actual issue?...
email.pyfrom celery.task import taskfrom django.core.mail import send_mail@taskdef send(subject, message, recipient_list, ...
Um bom padrãofrom email import send@taskdef relatorio(dados):    ....gera relatorio....    send.delay("Relatorio Pronto", ...
StandAloneScripts
Map Reduce tarefas = [] livros =["iliada.txt","odisseia.txt"....] for filename in livros:     tarefas.append(         cont...
Armadilhas e dicas
Django-celery noadmin
Inicia um worker$ ./manage.py celeryd -l info -E
e daí: BAM!
Tem que rolar também$ ./manage.py celerycam
Testar#no settings.pyTEST_RUNNER=djcelery.contrib.test_runner.run_testsfrom django.test import TestCasefrom myapp.tasks im...
Sem respostaCELERY_IGNORE_RESULT = True
Transactions nodjangodef bar(request):    sanduiche = Sanduiche("Pernil")    sanduiche.save()    avisa_novo.delay(sanduich...
Especialmente seMIDDLEWARE_CLASSES = (    django.middleware.transaction.TransactionMiddleware,    ...
Assimdef bar(request):    sanduiche = Sanduiche("Pernil")    sanduiche.save()    if transaction.is_managed():        trans...
Para desenvolvimentofrom socket import errortry:    avisa_novo.delay(sanduiche.id)except error:    log.error("conexao recu...
Muitas tarefasfor i in algo_grande:    avisa_novo.delay(i)
Muitas tarefassubtasks = []for i in algo_grande:    subtasks.append(subtask(avisa_novo, args=(i)))TaskSet(tasks=subtasks)....
Créditoshttp://www.flickr.com/photos/lexnger/1794462309http://www.flickr.com/photos/atmtx/4250159996http://www.flickr.com/...
Dúvidas?@fractal+Adriano Petrich[codando.com.br, sfp.adrianopetrich.com,blog.adrianopetrich.com]
Deixa para depois, Procrastinando com Celery em Python
Upcoming SlideShare
Loading in...5
×

Deixa para depois, Procrastinando com Celery em Python

1,262

Published on

Palestra do #TDC2011 que mostra como usar o celery para tarefas distribuidas

Published in: Technology, Self Improvement

Deixa para depois, Procrastinando com Celery em Python

  1. 1. Procrastinando com Celery.adriano petrich petrich@gmail.com #TDC2011
  2. 2. O que é o Celery?
  3. 3. Ponto forte do Celery • Gerenciador de tarefas assíncrono
  4. 4. Ponto forte do Celery • Gerenciador de tarefas assíncrono • Distribuído entre máquinas
  5. 5. Os dois pontos fortesdo Celery • Gerenciador de tarefas assíncrono • Distribuído entre máquinas
  6. 6. Os dois pontos fortesdo Celery • Gerenciador de tarefas assíncrono • Distribuído entre máquinas • Agendador
  7. 7. CeleryDentre os pontos fortes do Celerydestacam-se • Gerenciador de tarefas assíncrono • Distribuído entre máquinas • Agendador • Com tolerância a falhas
  8. 8. Como Funciona?
  9. 9. Resposta Curta
  10. 10. .
  11. 11. Resposta Longa
  12. 12. EstruturaTarefaPublicadoresFilaTrabalhadores/Consumidores
  13. 13. Tarefa
  14. 14. Tarefafrom celery.task import task@taskdef foo(val): return val
  15. 15. Publicador
  16. 16. PublicadoresSincronamente >>> foo(5) 5
  17. 17. PublicadoresAssincronamente >>> res = foo.delay(5)
  18. 18. Dois Jeitos# não bloqueia>>> res.ready()True ou False>>> res.result5# ou bloqueia>>> res.get()5
  19. 19. Fila
  20. 20. FilaBackend sugerido é o RabbitMQ(todas as crianças legais do bairro usamerlang)
  21. 21. Mas também suportaRedisBeanstalkMongoDBCouchDBe bancos suportados pelo ORM do Django
  22. 22. Trabalhador
  23. 23. TrabalhadorPode estar rodando em outra máquinaCada Worker process ainda pode usarvários threads
  24. 24. Trabalhador$ celeryd$ ./manage celeryd
  25. 25. Por que?
  26. 26. Web ou StandAlone?
  27. 27. WebPainel de Escalabilidade (djangocon.eu)http://2011.djangocon.eu/talks/47/
  28. 28. Problemas comunsWhat are the common mistakes you see.--------------------------------------Things that take a long time ("sending an email")that lock up a process. Using the filesystem for caching.Testing locally and pushing it live and see it fall over.Using an external API can also take a long time.Work with timeouts to work around it.
  29. 29. Processos demoradosentopem os tubes
  30. 30. Soluções comunsTenha um celery de criança:Scaling wise, what should you think about before scalingbecomes an actual issue? And what should you definitelyleave until the moment comes you need to scale?----------------------------------------------First things first: use a queue like celery, even on small sites.Get used to such a queue and have it in place, thatll help alot with performance later.Make sure youve got your databaseschema is mostly OK. It doesnt have to be perfect right away,but at least mostly OK.Expect something to change and assume youll have to swap somethingout later to improve the performance.
  31. 31. email.pyfrom celery.task import taskfrom django.core.mail import send_mail@taskdef send(subject, message, recipient_list, from_email=None, **kwargs): if subject[0] != "[": subject = "[projeto] "+ subject if from_email is None: from_email = "suporte@fuuuuuu.com" send_mail(subject, message, from_email, recipient_list, **kwargs)
  32. 32. Um bom padrãofrom email import send@taskdef relatorio(dados): ....gera relatorio.... send.delay("Relatorio Pronto", """ Pode baixadas daqui: http://fuuuuuu.com/relatorios/%s.pdf """% filename, (email,))
  33. 33. StandAloneScripts
  34. 34. Map Reduce tarefas = [] livros =["iliada.txt","odisseia.txt"....] for filename in livros: tarefas.append( conta_palavras.delay(filename) )para pegar o resultadoif all([i.ready() for i in tarefas]): palavras = sum([i.result for i in tarefas])
  35. 35. Armadilhas e dicas
  36. 36. Django-celery noadmin
  37. 37. Inicia um worker$ ./manage.py celeryd -l info -E
  38. 38. e daí: BAM!
  39. 39. Tem que rolar também$ ./manage.py celerycam
  40. 40. Testar#no settings.pyTEST_RUNNER=djcelery.contrib.test_runner.run_testsfrom django.test import TestCasefrom myapp.tasks import addclass AddTestCase(TestCase): def testNoError(self): """Test that the ``add`` task runs with no errors, and returns the correct result.""" result = add.delay(8, 8) self.assertEquals(result.get(), 16) self.assertTrue(result.successful())
  41. 41. Sem respostaCELERY_IGNORE_RESULT = True
  42. 42. Transactions nodjangodef bar(request): sanduiche = Sanduiche("Pernil") sanduiche.save() avisa_novo.delay(sanduiche.id)
  43. 43. Especialmente seMIDDLEWARE_CLASSES = ( django.middleware.transaction.TransactionMiddleware, ...
  44. 44. Assimdef bar(request): sanduiche = Sanduiche("Pernil") sanduiche.save() if transaction.is_managed(): transaction.commit() avisa_novo.delay(sanduiche.id)
  45. 45. Para desenvolvimentofrom socket import errortry: avisa_novo.delay(sanduiche.id)except error: log.error("conexao recusada") if not DEBUG: raise error
  46. 46. Muitas tarefasfor i in algo_grande: avisa_novo.delay(i)
  47. 47. Muitas tarefassubtasks = []for i in algo_grande: subtasks.append(subtask(avisa_novo, args=(i)))TaskSet(tasks=subtasks).apply_async()
  48. 48. Créditoshttp://www.flickr.com/photos/lexnger/1794462309http://www.flickr.com/photos/atmtx/4250159996http://www.flickr.com/photos/prettydaisies/2368005479http://www.flickr.com/photos/benobryan/3766107097http://www.flickr.com/photos/eli_k_hayasaka/3989808211http://www.flickr.com/photos/carolinabarmell/2980660350http://www.flickr.com/photos/jjay/2415455625http://www.flickr.com/photos/tim_proffitt_white/3181616233http://www.flickr.com/photos/daniele_sartori/4484430735http://www.flickr.com/photos/project-404/27730644
  49. 49. Dúvidas?@fractal+Adriano Petrich[codando.com.br, sfp.adrianopetrich.com,blog.adrianopetrich.com]
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×