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.
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
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
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
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
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
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
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