Tornado
-
Upload
marcel-nicolay -
Category
Technology
-
view
473 -
download
1
description
Transcript of Tornado
![Page 1: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/1.jpg)
TORNADO3.0!"r #$%&r" #'( %"v)#'#$(
GO
Tuesday, May 28, 13
![Page 2: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/2.jpg)
quatix.com.br MARCELNICOLAY.COM
O q*$ +?
TornadoUm 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
![Page 3: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/3.jpg)
quatix.com.br MARCELNICOLAY.COM
O q*$ +?
TornadoUm 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
![Page 4: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/4.jpg)
quatix.com.br MARCELNICOLAY.COM
O q*$ +?
TornadoUm 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.ioloopimport 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
![Page 5: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/5.jpg)
P'r' q*$ ($rv$?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
![Page 6: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/6.jpg)
P'r' q*$ ($rv$?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• muito rápido
• economiza recursos• non-blocking I/O
!"#$% #&'#()'%
ALTA PERFORMANCE
Tuesday, May 28, 13
![Page 7: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/7.jpg)
•lida bem com muitas conexões abertas simultâneamente
• fácil gerência de contexto• suporte a websockets
!"#$% #&'#()'%
TEMPO REAL
P'r' q*$ ($rv$?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• muito rápido
• economiza recursos• non-blocking I/O
!"#$% #&'#()'%
ALTA PERFORMANCE
Tuesday, May 28, 13
![Page 8: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/8.jpg)
•lida bem com muitas conexões abertas simultâneamente
• fácil gerência de contexto• suporte a websockets
!"#$% #&'#()'%
TEMPO REAL
• bem simples de usar
• template• internacionalização
• user authentication• crsf protection
#&'#()'%
small apps
P'r' q*$ ($rv$?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• muito rápido
• economiza recursos• non-blocking I/O
!"#$% #&'#()'%
ALTA PERFORMANCE
Tuesday, May 28, 13
![Page 9: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/9.jpg)
•lida bem com muitas conexões abertas simultâneamente
• fácil gerência de contexto• suporte a websockets
!"#$% #&'#()'%
TEMPO REAL
• bem simples de usar
• template• internacionalização
• user authentication• crsf protection
#&'#()'%
small apps#&'#()'%
quando você quiser
P'r' q*$ ($rv$?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
• legal e divertido• muito rápido
• economiza recursos• non-blocking I/O
!"#$% #&'#()'%
ALTA PERFORMANCE
Tuesday, May 28, 13
![Page 10: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/10.jpg)
eventdriven!r",r'-'çã" "r)$%&'#' ' $v$%&.
GO
Tuesday, May 28, 13
![Page 11: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/11.jpg)
O q*$ +?
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
![Page 12: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/12.jpg)
Pr"b/$-'(
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
![Page 13: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/13.jpg)
quatix.com.br MARCELNICOLAY.COM
O q*$ + ?
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
![Page 14: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/14.jpg)
quatix.com.br MARCELNICOLAY.COM
M$/0"r'%#" *- !"*1"!
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
![Page 15: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/15.jpg)
quatix.com.br MARCELNICOLAY.COM
M$/0"r'%#" *- !"*1"!
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
![Page 16: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/16.jpg)
O q*$ +?
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
![Page 17: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/17.jpg)
O q*$ +?
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 3148futures, 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 objectsresponsável por executar as chamadas assíncronamente em threads e processos
FUTURE OBJECTsencapsula 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
![Page 18: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/18.jpg)
O q*$ +?
concurrentfutures
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
from concurrent import futuresimport 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
![Page 19: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/19.jpg)
S)-!/)21'%#" '( 1")('(
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
![Page 20: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/20.jpg)
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
N"v)#'#$ %' v$r('" 3.0
callbackpassingstyle
@marcelnicolay
Tuesday, May 28, 13
![Page 21: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/21.jpg)
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
N"v)#'#$ %' v$r('" 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
![Page 22: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/22.jpg)
asynciosupport'(3%10r"%"*( I/O f"r !3&0"% (&'%#'r# /)br'r3
GO
Tuesday, May 28, 13
![Page 23: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/23.jpg)
O q*$ +?
asynciosupport
quatix.com.br MARCELNICOLAY.COM
Uma proposta para oferecer suporte completo à asynchronous I/O no python 3.
@marcelnicolay
Tuesday, May 28, 13
![Page 24: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/24.jpg)
O q*$ +?
asynciosupport
quatix.com.br MARCELNICOLAY.COM
Uma proposta para oferecer suporte completo à asynchronous I/O no python 3.
@marcelnicolay
PEP 3156Asynchronous I/O support rebooted, DEZ/2012
python 3.4 +Está sendo implementada e deve integrar a próxima versão do python
event loopLoop 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 protocolAbstração de alto nível para manipulação das camadas de transporte (TCP, SSL) e protocolo (HTTP, SMTP)
coroutinesGeradores 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
![Page 25: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/25.jpg)
A(3%10r"%"*( I/O (*!!"r&
asyncframeworks
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
![Page 26: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/26.jpg)
A(3%10r"%"*( I/O (*!!"r&
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
![Page 27: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/27.jpg)
A(3%10r"%"*( I/O (*!!"r&
interoperabilidade
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
![Page 28: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/28.jpg)
A(3%10r"%"*( I/O (*!!"r&
tornado
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
ben darnell
Tuesday, May 28, 13
![Page 29: Tornado](https://reader034.fdocuments.net/reader034/viewer/2022051208/54795866b4af9f49348b457c/html5/thumbnails/29.jpg)
AdressRio de Janeiro, RJ
Phone(21) 7656-6952
quatixquatix.com.br
websitemarcelnicolay.com
ContactUsG$& )% &"*10
facebook.com/marcelnicolaytwitter.com/marcelnicolay
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13