Tornado, often thought of as a web development framework and toolset is built on top of a protocol-agnostic IOLoop, presenting an alternative to Twisted as a foundation for asynchronous application development in Python. This talk covers the Tornado IOLoop, its features and the process of writing drivers and applications using it.
Video available at https://www.youtube.com/watch?v=3BYN3ouwkRA
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
More than just a pretty web framework: the Tornado IOLoop
1. More than just a pretty web framework:
the Tornado IOLoop
Gavin M. Roy
2. About myYearbook
According to comScore,
myYearbook is one of the 25 most-
trafficked sites in the United States
as measured by page views, by
minutes, and by minutes per visitor
per month.
http://www.myyearbook.com/careers
PyCon 2012 Follow me on Twitter: @Crad
3. Tornado @
myYearbook
• At myYearbook, we used Tornado in high-
request-velocity applications.
• Web apps
• Finite State Machine Game Server
• Take what you need? We do.
PyCon 2012 Follow me on Twitter: @Crad
4. Async Network
Programming
• Core revolves around an I/O loop
• Let the Operating System indicate when
to read, when to write and when there
are errors on sockets.
• select, poll, epoll (Linux), kqueue (BSD)
• Callback-Passing Style
PyCon 2012 Follow me on Twitter: @Crad
5. Async Network
Programming
PyCon 2012 Follow me on Twitter: @Crad
6. Callback Passing Style
def start(foo):
# Do stuff with foo and when done 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):
# Send the response
send_response(baz)
# Let our handler know we are done
finish()
PyCon 2012 Follow me on Twitter: @Crad
7. tornado.IOLoop
• Core of Tornado’s network stack
• Fast and easy to use
• Single instance per process Works on windows but
not supported.
C-Based epoll, not required
• Cross-platform
• Easy to read source: http://goo.gl/VFeAF
• Used for client libraries & server
applications
PyCon 2012 Follow me on Twitter: @Crad
8. tornado.IOStream
• Convenient utility class for dealing with the
IOLoop
• Does most of the work for you
• This too is for use by clients and server
applications
PyCon 2012 Follow me on Twitter: @Crad
9. IOStream: How to read
• read_until_regex
(regex, callback)
• read_until
(delimiter, callback)
• read_bytes
(num_bytes, callback,
streaming_callback=None)
• read_until_close
(callback,
streaming_callback=None)
PyCon 2012 Follow me on Twitter: @Crad
10. IOStream: What’s Going On?
reading(), writing(), closed()
PyCon 2012 Follow me on Twitter: @Crad
11. Serious
Business Uses
SSL
And that’s why SSLIOStream Exists.
PyCon 2012 Follow me on Twitter: @Crad
17. Events?
READ, WRITE, ERROR
PyCon 2012 Follow me on Twitter: @Crad
18. “Example”
import socket
from tornado import ioloop
def on_events(fd, events, error=None):
if events & ioloop.IOLoop.READ:
print 'Socket read: %r' % fd.recv(1024)
if events & ioloop.IOLoop.ERROR:
print 'Error received: %r' % error
if events & ioloop.IOLoop.WRITE:
pass
_ioloop = ioloop.IOLoop.instance()
fd = socket.socket() # Other stuff needs to be done here
events_desired = ioloop.IOLoop.READ | ioloop.IOLoop.ERROR
_ioloop.add_handler(fd, on_events, events_desired)
_ioloop.start()
PyCon 2012 Follow me on Twitter: @Crad
19. Timers add_timeout returns a
reference
deadline can be unix
timestamp or a
datetime.timedelta
• add_timeout
(deadline, callback)
• remove_timeout
(timeout)
PyCon 2012 Follow me on Twitter: @Crad
24. Last Thoughts
• Single threaded, use processes
• Watch out for resource contention
• Benchmark your application
• Fork work to remote workers
• multiprocessing.reduction
PyCon 2012 Follow me on Twitter: @Crad
25. multiprocessing.reduction:
# Main process
from multiprocessing.reduction import reduce_handle
h = reduce_handle(client_socket.fileno())
pipe_to_worker.send(h) #instance of multiprocessing.Pipe
# Worker process
from multiprocessing.reduction import rebuild_handle
h = pipe.recv()
fd = rebuild_handle(h)
client_socket = socket.fromfd(fd, socket.AF_INET,
socket.SOCK_STREAM)
client_socket.send("hello from the worker processrn")
Questions?
PyCon 2012 Follow me on Twitter: @Crad