Deferred Inline Callbacks

As we learned in our first Twisted asynchronous tutorial, Deferreds are happy to step aside while they are waiting for something and allow other things to execute out of order. This is not always desired.

Twisted’s @inlineCallback wrapper allows the user to pause the execution of anything which results in a deferred and wait for the deferred to resolve using the yield keyword.

When to use it

When the final resolved value of something is required in order to safely continue. These are used frequently in Peek.

How to use it

Below, we create a function that uses @inlineCallBacks and a function that does not:

from twisted.internet.defer import inlineCallbacks
from twisted.internet.task import deferLater
from twisted.internet import reactor

from twisted.trial import unittest


class InlineExampleTest(unittest.TestCase):

    @inlineCallbacks
    def testWithInlineCallback(self):

        d = yield deferLater(reactor, 2, lambda: True)
        print(d)
        print("x")
        return d

    def testWithoutInlineCallback(self):
        d = deferLater(reactor, 2, lambda: True)
        d.addCallback(print)
        print(d)
        print("x")
        return d

When testWithInlineCallback is run, it should print True, followed by x, indicating that execution was put on hold while d resolved, resulting in an output like this:

True
x

Ran 1 test in 2.007s

OK

On the other hand, testWithoutInlineCallback should immediately print a Deferred object, then x, and then finally True, indicating that progress was able to continue before it resolved, with an output similar to this:

<Deferred at 0x10f300c88>
x
True

Ran 1 test in 2.007s

OK