Download - Tornado
TORNADO3.0!"r #$%&r" #'( %"v)#'#$(
GO
Tuesday, May 28, 13
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
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
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
P'r' q*$ ($rv$?
QUANDOUSAR
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
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
•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
•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
•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
eventdriven!r",r'-'çã" "r)$%&'#' ' $v$%&.
GO
Tuesday, May 28, 13
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
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
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
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
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
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
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
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
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
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
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
asynciosupport'(3%10r"%"*( I/O f"r !3&0"% (&'%#'r# /)br'r3
GO
Tuesday, May 28, 13
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
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
A(3%10r"%"*( I/O (*!!"r&
asyncframeworks
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
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
A(3%10r"%"*( I/O (*!!"r&
interoperabilidade
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
Tuesday, May 28, 13
A(3%10r"%"*( I/O (*!!"r&
tornado
quatix.com.br MARCELNICOLAY.COM @marcelnicolay
ben darnell
Tuesday, May 28, 13
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