Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Twisted Logic: Endpoints and Why You Shouldn't Be Scared of Twisted

Twisted Logic: Endpoints and Why You Shouldn't Be Scared of Twisted

This talk will be a survey of my learning experience adding new endpoint APIs to Twisted, an event-driven networking engine (as a Google Summer of Code project), with a special focus on the analysis of some of the horror stories that surround Twisted. Right from the asynchronous I/O model to Deferreds: if it scares you, we’ll figure a way out and see what the makers of Twisted say when confronted.

Ashwini Oruganti

March 15, 2013
Tweet

More Decks by Ashwini Oruganti

Other Decks in Programming

Transcript

  1. Twisted Logic
    - Ashwini Oruganti
    @_ashfall_
    PyCon 2013

    View full-size slide

  2. Twisted
    asynchronous event-driven
    networking framework

    View full-size slide

  3. Twisted
    asynchronous event-driven
    networking framework
    aka... HARD

    View full-size slide

  4. Google Summer of Code
    spend the summer working on
    an open source project with a
    mentoring organization

    View full-size slide

  5. Endpoint
    an interface with a single method that
    takes an argument
    returns*:
    a listening port / a connected protocol

    View full-size slide

  6. endpoint = TCP4ServerEndpoint(reactor, 8007)
    endpoint.listen(Factory())
    endpoint = TCP4ClientEndpoint(reactor,
    "localhost", 8007)
    endpoint.connect(Factory())
    Server
    Client

    View full-size slide

  7. class TCP4ServerEndpoint(object):
    """
    Implements TCP server endpoint with an IPv4
    configuration
    """
    ...
    def __init__(self, reactor, port,
    backlog=50, interface=''):
    ...
    def listen(self, protocolFactory):
    return defer.execute(
    self._reactor.listenTCP,
    ...)

    View full-size slide

  8. class TCP6ServerEndpoint(object):
    """
    Implements TCP server endpoint with an IPv6
    configuration
    """
    ...
    def __init__(self, reactor, port,
    backlog=50, interface='::'):
    ...
    def listen(self, protocolFactory):
    return defer.execute(
    self._reactor.listenTCP,
    ...)

    View full-size slide

  9. It’s just code.

    View full-size slide

  10. class StandardIOEndpoint(object):
    """
    A Standard Input/Output endpoint
    """
    implements(interfaces.IStreamServerEndpoint)
    def __init__(self, reactor):
    ...
    def listen(self, stdioProtocolFactory):
    return defer.execute(stdio.StandardIO,
    stdioProtocolFactory.buildProtocol(
    PipeAddress()))

    View full-size slide

  11. Moral of the story:
    Do not get flustered.
    Do not overthink..
    Forget it's Twisted

    View full-size slide

  12. Read the code.
    Solve the problem
    (write code)
    Moral of the story:

    View full-size slide

  13. There’s nothing more
    boring
    than the
    comfort zone

    View full-size slide

  14. TCP Client Endpoint
    IPv6 addresses
    Hostname Resolution

    View full-size slide

  15. class TCP6ClientEndpoint(object):
    def __init__(self, reactor, host, port,
    timeout=30, bindAddress=None):
    ...
    def connect(self, protocolFactory):
    """
    Connect via TCP, once the hostname
    resolution is done.
    """
    ...

    View full-size slide

  16. def _nameResolution(self, host):
    """
    Resolve the hostname string into a tuple
    containing the host IPv6 address.
    """
    ...
    def _resolvedHostConnect(self, resolvedHost,
    protocolFactory):
    """
    Connect to the server using the resolved
    hostname.
    """
    ...

    View full-size slide

  17. Deferred
    Callbacks and Errbacks
    Flow is not obvious
    Debugging is tricky

    View full-size slide

  18. class SomeState(object):
    def __init__(self):
    self.values = []
    def getValue(self):
    return self.values.pop(0)
    def addValue(self, value):
    self.values.append(value)

    View full-size slide

  19. def foo():
    return SomeState()
    def bar():
    state = foo()
    print state.getValue()

    View full-size slide

  20. Firing the Deferred
    def foo():
    s = SomeState()
    s.addValue(2)
    return s

    View full-size slide

  21. It’s just code.

    View full-size slide

  22. It’s 'X', when it isn't
    really 'X'

    View full-size slide

  23. It’s full of highly
    complex concepts!

    View full-size slide

  24. “It was created by a couple of
    dudes who dropped out of
    school, and a 16-year-old.
    HOW HARD COULD IT BE?”

    View full-size slide

  25. It’s foreign!

    View full-size slide

  26. camelCase
    PEP8: July 5, 2001
    Twisted’s coding
    standard: May 2, 2001

    View full-size slide

  27. It’s huge!

    View full-size slide

  28. “Core can fit into a floppy
    disk.”

    View full-size slide

  29. Know what you're
    doing.

    View full-size slide