Tornado

29
TORNADO3.0 r r v GO Tuesday, May 28, 13

description

Recentemente foi anunciada a versão 3.0 do Tornado, um framework web non-blocking escrito para lidar com milhares de conexões simultâneas. Umas das grandes mudanças é o suporte a "Futures", introduzida no python 3.2 para dar mais poder aos tradicionais callbacks. Iremos conhecer as principais funcionalidades do Tornado, ressaltando as novidades implementadas na última versão, e comentar sobre as novas tendências para a programação assíncrona no python.

Transcript of Tornado

Page 1: Tornado

TORNADO3.0!"r #$%&r" #'( %"v)#'#$(

GO

Tuesday, May 28, 13

Page 2: Tornado

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

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

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

P'r' q*$ ($rv$?

QUANDOUSAR

quatix.com.br MARCELNICOLAY.COM @marcelnicolay

Tuesday, May 28, 13

Page 6: Tornado

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

•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

•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

•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

eventdriven!r",r'-'çã" "r)$%&'#' ' $v$%&.

GO

Tuesday, May 28, 13

Page 11: Tornado

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

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

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

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

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

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

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

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

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

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

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

asynciosupport'(3%10r"%"*( I/O f"r !3&0"% (&'%#'r# /)br'r3

GO

Tuesday, May 28, 13

Page 23: Tornado

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

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

A(3%10r"%"*( I/O (*!!"r&

asyncframeworks

quatix.com.br MARCELNICOLAY.COM @marcelnicolay

Tuesday, May 28, 13

Page 26: Tornado

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

A(3%10r"%"*( I/O (*!!"r&

interoperabilidade

quatix.com.br MARCELNICOLAY.COM @marcelnicolay

Tuesday, May 28, 13

Page 28: Tornado

A(3%10r"%"*( I/O (*!!"r&

tornado

quatix.com.br MARCELNICOLAY.COM @marcelnicolay

ben darnell

Tuesday, May 28, 13

Page 29: Tornado

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