SlideShare a Scribd company logo
1 of 29
Download to read offline
TORNADO3.0por dentro das novidades
GO
Tuesday, May 28, 13
quatix.com.br MARCELNICOLAY.COM
O que é?
Tornado
Um framework web e uma biblioteca de rede assíncrona, originalmente
desenvolvida para o FriendFeed, atualmente na versão 3.0.1
@marcelnicolay
Tuesday, May 28, 13
quatix.com.br MARCELNICOLAY.COM
O que é?
Tornado
Um framework web e uma biblioteca de rede assíncrona, originalmente
desenvolvida para o FriendFeed, atualmente na versão 3.0.1
non-blocking i/o
event driven
rápido
escalável
simples
FLEXÍVEL
testável
@marcelnicolay
Tuesday, May 28, 13
quatix.com.br MARCELNICOLAY.COM
O que é?
Tornado
Um framework web e uma biblioteca de rede assíncrona, originalmente
desenvolvida para o FriendFeed, atualmente na versão 3.0.1
non-blocking i/o
event driven
rápido
escalável
simples
FLEXÍVEL
testável
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
@marcelnicolay
Tuesday, May 28, 13
Para que serve?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
Para que serve?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• muito rápido
• economiza recursos
• non-blocking I/O
muito indicado
ALTA PERFORMANCE
Tuesday, May 28, 13
•lida bem com muitas
conexões abertas
simultâneamente
• fácil gerência de contexto
• suporte a websockets
muito indicado
TEMPO REAL
Para que serve?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• muito rápido
• economiza recursos
• non-blocking I/O
muito indicado
ALTA PERFORMANCE
Tuesday, May 28, 13
•lida bem com muitas
conexões abertas
simultâneamente
• fácil gerência de contexto
• suporte a websockets
muito indicado
TEMPO REAL
• bem simples de usar
• template
• internacionalização
• user authentication
• crsf protection
indicado
small apps
Para que serve?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• muito rápido
• economiza recursos
• non-blocking I/O
muito indicado
ALTA PERFORMANCE
Tuesday, May 28, 13
•lida bem com muitas
conexões abertas
simultâneamente
• fácil gerência de contexto
• suporte a websockets
muito indicado
TEMPO REAL
• bem simples de usar
• template
• internacionalização
• user authentication
• crsf protection
indicado
small apps
indicado
quando você quiser
Para que serve?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• legal e divertido• muito rápido
• economiza recursos
• non-blocking I/O
muito indicado
ALTA PERFORMANCE
Tuesday, May 28, 13
eventdrivenprogramação orientada a eventos
GO
Tuesday, May 28, 13
O que é?
eventdrivenprogramming
quatix.com.br MARCELNICOLAY.COM
É um paradigma de programação onde o fluxo do programa é determinado por
eventos. Também pode ser definido como uma técnica de arquitetura de
aplicação onde a aplicação possui um loop principal divido em duas etapas: (1)
selecionar o evento; (2) manipular o evento;
@marcelnicolay
Tuesday, May 28, 13
Problemas
eventdrivenprogramming
quatix.com.br MARCELNICOLAY.COM
díficil para nossa cabeça
um simples erro pode f*der tudo
código orientado a eventos é mais
complexo
callbacks alinhados, como no javascript
mais lento
@marcelnicolay
Tuesday, May 28, 13
quatix.com.br MARCELNICOLAY.COM
O que é ?
callbackpassingstyle
@marcelnicolay
def start(foo):
# do stuff with foo and when donw call the next function
stuff(callback=next_step, data=foo);
def next_step(bar):
# call more_stuff to parse bar
more_stuff(callback=last_step, data=bar)
def last_step(baz):
# senf the response
send_response(baz)
#let our handler know we are done
finish()
Tuesday, May 28, 13
quatix.com.br MARCELNICOLAY.COM
Melhorando um pouco!
callbackpassingstyle
@marcelnicolay
class AsyncHandler(RequestHandler):
@asynchronous
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://example.com",
callback=self.on_fetch)
def on_fetch(self, response):
do_something_with_response(response)
self.render("template.html")
Tuesday, May 28, 13
quatix.com.br MARCELNICOLAY.COM
Melhorando um pouco!
callbackpassingstyle
@marcelnicolay
class AsyncHandler(RequestHandler):
@asynchronous
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://example.com",
callback=self.on_fetch)
def on_fetch(self, response):
do_something_with_response(response)
self.render("template.html")
class GenAsyncHandler(RequestHandler):
@asynchronous
@gen.engine
def get(self):
http_client = AsyncHTTPClient()
response = yield gen.Task(
http_client.fetch,
"http://example.com")
do_something_with_response(response)
self.render("template.html")
Tuesday, May 28, 13
O que é?
concurrentfutures
quatix.com.br MARCELNICOLAY.COM
Um módulo que provê uma interface de alto nível para execução de chamadas
assíncronas.
@marcelnicolay
Tuesday, May 28, 13
O que é?
concurrentfutures
quatix.com.br MARCELNICOLAY.COM
Um módulo que provê uma interface de alto nível para execução de chamadas
assíncronas.
@marcelnicolay
PEP 3148
futures, executando computação
assíncronamente.
python 3.2 +
introduzida na versão 3.2, portado para as versões
anteriores através do módulo “futures”
Executor objects
responsável por executar as chamadas
assíncronamente em threads e processos
FUTURE OBJECTs
encapsula a execução assíncrona de uma
chamada permitindo a manipulação através dos
métodos: cancel, running, result,
add_done_callback, exception, etc..
Tuesday, May 28, 13
O que é?
concurrentfutures
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
from concurrent import futures
import urllib.request
URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']
def load_url(url, timeout):
return urllib.request.urlopen(url, timeout=timeout).read()
def main():
with futures.ThreadPoolExecutor(max_workers=5) as executor:
future_to_url = dict(
(executor.submit(load_url, url, 60), url)
for url in URLS)
for future in futures.as_completed(future_to_url):
url = future_to_url[future]
try:
print('%r page is %d bytes' % (
url, len(future.result())))
except Exception as e:
print('%r generated an exception: %s' % (
url, e))
Tuesday, May 28, 13
Simplificando as coisas
tornadofutures
quatix.com.br MARCELNICOLAY.COM
A maioria das funções assíncronas do tornado passam agora a retornar uma
Future; mandando um yield neste objeto o resultado é retornado.
@marcelnicolay
class AsyncHandlerFuture(RequestHandler):
@asynchronous
def get(self):
http_client = AsyncHTTPClient()
future = http_client.fetch("http://example.com")
future.add_done_callback(self.on_fetch)
def on_fetch(self, future):
response = future.result()
do_something_with_response(response)
self.render("template.html")
Tuesday, May 28, 13
class GenAsyncHandler(RequestHandler):
@asynchronous
@gen.engine
def get(self):
http_client = AsyncHTTPClient()
response = yield gen.Task(
http_client.fetch,
"http://example.com")
do_something_with_response(response)
self.render("template.html")
quatix.com.br MARCELNICOLAY.COM
Novidade na versao 3.0
callbackpassingstyle
@marcelnicolay
Tuesday, May 28, 13
class GenAsyncHandler(RequestHandler):
@asynchronous
@gen.engine
def get(self):
http_client = AsyncHTTPClient()
response = yield gen.Task(
http_client.fetch,
"http://example.com")
do_something_with_response(response)
self.render("template.html")
quatix.com.br MARCELNICOLAY.COM
Novidade na versao 3.0
callbackpassingstyle
@marcelnicolay
class BetterGenAsyncHandler(RequestHandler):
@asynchronous
@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response = yield http_client
.fetch("http://example.com")
do_something_with_response(response)
self.render("template.html")
Tuesday, May 28, 13
asynciosupportasynchronous I/O for python standard library
GO
Tuesday, May 28, 13
O que é?
asynciosupport
quatix.com.br MARCELNICOLAY.COM
Uma proposta para oferecer suporte completo à asynchronous I/O no python 3.
@marcelnicolay
Tuesday, May 28, 13
O que é?
asynciosupport
quatix.com.br MARCELNICOLAY.COM
Uma proposta para oferecer suporte completo à asynchronous I/O no python 3.
@marcelnicolay
PEP 3156
Asynchronous I/O support rebooted, DEZ/2012
python 3.4 +
Está sendo implementada e deve integrar a
próxima versão do python
event loop
Loop para gerenciar eventos de leitura e escrita
em chamadas assíncronas, multiplaforma e de fácil
integração por frameworks como tornado e
twistted
transport and protocol
Abstração de alto nível para manipulação das
camadas de transporte (TCP, SSL) e protocolo
(HTTP, SMTP)
coroutines
Geradores que seguem certas convenções. O seu
uso não será obrigatório (você poderá usar
callbacks), mas seu uso é encorajado e terá
suporte completo através de Futures / Tasks
Tuesday, May 28, 13
Asynchronous I/O support
asyncframeworks
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
Asynchronous I/O support
asyncframeworks
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
TOrnado
twisted
gevent
circuits
concurrence
diesel
eventlet
cogen
multitask
chiral
friendlyflow
weighless
pyftplib
asyncoro
asyncore
pulsar
Tuesday, May 28, 13
Asynchronous I/O support
interoperabilidade
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
Asynchronous I/O support
tornado
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
ben darnell
Tuesday, May 28, 13
Adress
Rio de Janeiro, RJ
Phone
(21) 7656-6952
quatix
quatix.com.br
website
marcelnicolay.com
ContactUs
Get in touch
facebook.com/marcelnicolay
twitter.com/marcelnicolay
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13

More Related Content

Similar to Tornado 3.0: Novidades do framework assíncrono

Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Daniel Makiyama
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
O que aprendi após 3 bilhões de jobs processados no Sidekiq
O que aprendi após 3 bilhões de jobs processados no SidekiqO que aprendi após 3 bilhões de jobs processados no Sidekiq
O que aprendi após 3 bilhões de jobs processados no SidekiqAnderson Dias
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraCaelum
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Os 10 Maus Hábitos dos Desenvolvedores JSF
Os 10 Maus Hábitos dos Desenvolvedores JSFOs 10 Maus Hábitos dos Desenvolvedores JSF
Os 10 Maus Hábitos dos Desenvolvedores JSFtarsobessa
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaGiovanni Bassi
 
Node.js para desenvolvedores .NET
Node.js para desenvolvedores .NETNode.js para desenvolvedores .NET
Node.js para desenvolvedores .NETMVP Microsoft
 
JasperReports Tecnicas de geracao_de_relatorios1
JasperReports  Tecnicas de geracao_de_relatorios1JasperReports  Tecnicas de geracao_de_relatorios1
JasperReports Tecnicas de geracao_de_relatorios1Sliedesharessbarbosa
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
JS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com IonicJS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com IoniciMasters
 
Ionic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRxIonic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRxLoiane Groner
 
Kyrios: Infra-estrutura livre para desenvolvimento de software
Kyrios: Infra-estrutura livre para desenvolvimento de softwareKyrios: Infra-estrutura livre para desenvolvimento de software
Kyrios: Infra-estrutura livre para desenvolvimento de softwareFábio Nogueira de Lucena
 

Similar to Tornado 3.0: Novidades do framework assíncrono (20)

Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
O que aprendi após 3 bilhões de jobs processados no Sidekiq
O que aprendi após 3 bilhões de jobs processados no SidekiqO que aprendi após 3 bilhões de jobs processados no Sidekiq
O que aprendi após 3 bilhões de jobs processados no Sidekiq
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Os 10 Maus Hábitos dos Desenvolvedores JSF
Os 10 Maus Hábitos dos Desenvolvedores JSFOs 10 Maus Hábitos dos Desenvolvedores JSF
Os 10 Maus Hábitos dos Desenvolvedores JSF
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
 
React js
React js React js
React js
 
Node.js para desenvolvedores .NET
Node.js para desenvolvedores .NETNode.js para desenvolvedores .NET
Node.js para desenvolvedores .NET
 
JasperReports Tecnicas de geracao_de_relatorios1
JasperReports  Tecnicas de geracao_de_relatorios1JasperReports  Tecnicas de geracao_de_relatorios1
JasperReports Tecnicas de geracao_de_relatorios1
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
JS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com IonicJS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com Ionic
 
Ionic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRxIonic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRx
 
Kyrios: Infra-estrutura livre para desenvolvimento de software
Kyrios: Infra-estrutura livre para desenvolvimento de softwareKyrios: Infra-estrutura livre para desenvolvimento de software
Kyrios: Infra-estrutura livre para desenvolvimento de software
 
Minicurso Java
Minicurso JavaMinicurso Java
Minicurso Java
 

Tornado 3.0: Novidades do framework assíncrono

  • 1. TORNADO3.0por dentro das novidades GO Tuesday, May 28, 13
  • 2. quatix.com.br MARCELNICOLAY.COM O que é? Tornado Um framework web e uma biblioteca de rede assíncrona, originalmente desenvolvida para o FriendFeed, atualmente na versão 3.0.1 @marcelnicolay Tuesday, May 28, 13
  • 3. quatix.com.br MARCELNICOLAY.COM O que é? Tornado Um framework web e uma biblioteca de rede assíncrona, originalmente desenvolvida para o FriendFeed, atualmente na versão 3.0.1 non-blocking i/o event driven rápido escalável simples FLEXÍVEL testável @marcelnicolay Tuesday, May 28, 13
  • 4. quatix.com.br MARCELNICOLAY.COM O que é? Tornado Um framework web e uma biblioteca de rede assíncrona, originalmente desenvolvida para o FriendFeed, atualmente na versão 3.0.1 non-blocking i/o event driven rápido escalável simples FLEXÍVEL testável import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() @marcelnicolay Tuesday, May 28, 13
  • 5. Para que serve? QUANDOUSAR quatix.com.br MARCELNICOLAY.COM @marcelnicolay Tuesday, May 28, 13
  • 6. Para que serve? QUANDOUSAR quatix.com.br MARCELNICOLAY.COM @marcelnicolay • muito rápido • economiza recursos • non-blocking I/O muito indicado ALTA PERFORMANCE Tuesday, May 28, 13
  • 7. •lida bem com muitas conexões abertas simultâneamente • fácil gerência de contexto • suporte a websockets muito indicado TEMPO REAL Para que serve? QUANDOUSAR quatix.com.br MARCELNICOLAY.COM @marcelnicolay • muito rápido • economiza recursos • non-blocking I/O muito indicado ALTA PERFORMANCE Tuesday, May 28, 13
  • 8. •lida bem com muitas conexões abertas simultâneamente • fácil gerência de contexto • suporte a websockets muito indicado TEMPO REAL • bem simples de usar • template • internacionalização • user authentication • crsf protection indicado small apps Para que serve? QUANDOUSAR quatix.com.br MARCELNICOLAY.COM @marcelnicolay • muito rápido • economiza recursos • non-blocking I/O muito indicado ALTA PERFORMANCE Tuesday, May 28, 13
  • 9. •lida bem com muitas conexões abertas simultâneamente • fácil gerência de contexto • suporte a websockets muito indicado TEMPO REAL • bem simples de usar • template • internacionalização • user authentication • crsf protection indicado small apps indicado quando você quiser Para que serve? QUANDOUSAR quatix.com.br MARCELNICOLAY.COM @marcelnicolay • legal e divertido• muito rápido • economiza recursos • non-blocking I/O muito indicado ALTA PERFORMANCE Tuesday, May 28, 13
  • 10. eventdrivenprogramação orientada a eventos GO Tuesday, May 28, 13
  • 11. O que é? eventdrivenprogramming quatix.com.br MARCELNICOLAY.COM É um paradigma de programação onde o fluxo do programa é determinado por eventos. Também pode ser definido como uma técnica de arquitetura de aplicação onde a aplicação possui um loop principal divido em duas etapas: (1) selecionar o evento; (2) manipular o evento; @marcelnicolay Tuesday, May 28, 13
  • 12. Problemas eventdrivenprogramming quatix.com.br MARCELNICOLAY.COM díficil para nossa cabeça um simples erro pode f*der tudo código orientado a eventos é mais complexo callbacks alinhados, como no javascript mais lento @marcelnicolay Tuesday, May 28, 13
  • 13. quatix.com.br MARCELNICOLAY.COM O que é ? callbackpassingstyle @marcelnicolay def start(foo): # do stuff with foo and when donw call the next function stuff(callback=next_step, data=foo); def next_step(bar): # call more_stuff to parse bar more_stuff(callback=last_step, data=bar) def last_step(baz): # senf the response send_response(baz) #let our handler know we are done finish() Tuesday, May 28, 13
  • 14. quatix.com.br MARCELNICOLAY.COM Melhorando um pouco! callbackpassingstyle @marcelnicolay class AsyncHandler(RequestHandler): @asynchronous def get(self): http_client = AsyncHTTPClient() http_client.fetch("http://example.com", callback=self.on_fetch) def on_fetch(self, response): do_something_with_response(response) self.render("template.html") Tuesday, May 28, 13
  • 15. quatix.com.br MARCELNICOLAY.COM Melhorando um pouco! callbackpassingstyle @marcelnicolay class AsyncHandler(RequestHandler): @asynchronous def get(self): http_client = AsyncHTTPClient() http_client.fetch("http://example.com", callback=self.on_fetch) def on_fetch(self, response): do_something_with_response(response) self.render("template.html") class GenAsyncHandler(RequestHandler): @asynchronous @gen.engine def get(self): http_client = AsyncHTTPClient() response = yield gen.Task( http_client.fetch, "http://example.com") do_something_with_response(response) self.render("template.html") Tuesday, May 28, 13
  • 16. O que é? concurrentfutures quatix.com.br MARCELNICOLAY.COM Um módulo que provê uma interface de alto nível para execução de chamadas assíncronas. @marcelnicolay Tuesday, May 28, 13
  • 17. O que é? concurrentfutures quatix.com.br MARCELNICOLAY.COM Um módulo que provê uma interface de alto nível para execução de chamadas assíncronas. @marcelnicolay PEP 3148 futures, executando computação assíncronamente. python 3.2 + introduzida na versão 3.2, portado para as versões anteriores através do módulo “futures” Executor objects responsável por executar as chamadas assíncronamente em threads e processos FUTURE OBJECTs encapsula a execução assíncrona de uma chamada permitindo a manipulação através dos métodos: cancel, running, result, add_done_callback, exception, etc.. Tuesday, May 28, 13
  • 18. O que é? concurrentfutures quatix.com.br MARCELNICOLAY.COM @marcelnicolay from concurrent import futures import urllib.request URLS = ['http://www.foxnews.com/', 'http://www.cnn.com/', 'http://europe.wsj.com/', 'http://www.bbc.co.uk/', 'http://some-made-up-domain.com/'] def load_url(url, timeout): return urllib.request.urlopen(url, timeout=timeout).read() def main(): with futures.ThreadPoolExecutor(max_workers=5) as executor: future_to_url = dict( (executor.submit(load_url, url, 60), url) for url in URLS) for future in futures.as_completed(future_to_url): url = future_to_url[future] try: print('%r page is %d bytes' % ( url, len(future.result()))) except Exception as e: print('%r generated an exception: %s' % ( url, e)) Tuesday, May 28, 13
  • 19. Simplificando as coisas tornadofutures quatix.com.br MARCELNICOLAY.COM A maioria das funções assíncronas do tornado passam agora a retornar uma Future; mandando um yield neste objeto o resultado é retornado. @marcelnicolay class AsyncHandlerFuture(RequestHandler): @asynchronous def get(self): http_client = AsyncHTTPClient() future = http_client.fetch("http://example.com") future.add_done_callback(self.on_fetch) def on_fetch(self, future): response = future.result() do_something_with_response(response) self.render("template.html") Tuesday, May 28, 13
  • 20. class GenAsyncHandler(RequestHandler): @asynchronous @gen.engine def get(self): http_client = AsyncHTTPClient() response = yield gen.Task( http_client.fetch, "http://example.com") do_something_with_response(response) self.render("template.html") quatix.com.br MARCELNICOLAY.COM Novidade na versao 3.0 callbackpassingstyle @marcelnicolay Tuesday, May 28, 13
  • 21. class GenAsyncHandler(RequestHandler): @asynchronous @gen.engine def get(self): http_client = AsyncHTTPClient() response = yield gen.Task( http_client.fetch, "http://example.com") do_something_with_response(response) self.render("template.html") quatix.com.br MARCELNICOLAY.COM Novidade na versao 3.0 callbackpassingstyle @marcelnicolay class BetterGenAsyncHandler(RequestHandler): @asynchronous @gen.coroutine def get(self): http_client = AsyncHTTPClient() response = yield http_client .fetch("http://example.com") do_something_with_response(response) self.render("template.html") Tuesday, May 28, 13
  • 22. asynciosupportasynchronous I/O for python standard library GO Tuesday, May 28, 13
  • 23. O que é? asynciosupport quatix.com.br MARCELNICOLAY.COM Uma proposta para oferecer suporte completo à asynchronous I/O no python 3. @marcelnicolay Tuesday, May 28, 13
  • 24. O que é? asynciosupport quatix.com.br MARCELNICOLAY.COM Uma proposta para oferecer suporte completo à asynchronous I/O no python 3. @marcelnicolay PEP 3156 Asynchronous I/O support rebooted, DEZ/2012 python 3.4 + Está sendo implementada e deve integrar a próxima versão do python event loop Loop para gerenciar eventos de leitura e escrita em chamadas assíncronas, multiplaforma e de fácil integração por frameworks como tornado e twistted transport and protocol Abstração de alto nível para manipulação das camadas de transporte (TCP, SSL) e protocolo (HTTP, SMTP) coroutines Geradores que seguem certas convenções. O seu uso não será obrigatório (você poderá usar callbacks), mas seu uso é encorajado e terá suporte completo através de Futures / Tasks Tuesday, May 28, 13
  • 25. Asynchronous I/O support asyncframeworks quatix.com.br MARCELNICOLAY.COM @marcelnicolay Tuesday, May 28, 13
  • 26. Asynchronous I/O support asyncframeworks quatix.com.br MARCELNICOLAY.COM @marcelnicolay TOrnado twisted gevent circuits concurrence diesel eventlet cogen multitask chiral friendlyflow weighless pyftplib asyncoro asyncore pulsar Tuesday, May 28, 13
  • 27. Asynchronous I/O support interoperabilidade quatix.com.br MARCELNICOLAY.COM @marcelnicolay Tuesday, May 28, 13
  • 28. Asynchronous I/O support tornado quatix.com.br MARCELNICOLAY.COM @marcelnicolay ben darnell Tuesday, May 28, 13
  • 29. Adress Rio de Janeiro, RJ Phone (21) 7656-6952 quatix quatix.com.br website marcelnicolay.com ContactUs Get in touch facebook.com/marcelnicolay twitter.com/marcelnicolay quatix.com.br MARCELNICOLAY.COM @marcelnicolay Tuesday, May 28, 13