summaryrefslogtreecommitdiff
path: root/doc/core/examples/threadedselect/blockingdemo.py
diff options
context:
space:
mode:
Diffstat (limited to 'doc/core/examples/threadedselect/blockingdemo.py')
-rw-r--r--doc/core/examples/threadedselect/blockingdemo.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/doc/core/examples/threadedselect/blockingdemo.py b/doc/core/examples/threadedselect/blockingdemo.py
new file mode 100644
index 0000000..7dc98df
--- /dev/null
+++ b/doc/core/examples/threadedselect/blockingdemo.py
@@ -0,0 +1,92 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+
+from twisted.internet import _threadedselect
+_threadedselect.install()
+
+from twisted.internet.defer import Deferred
+from twisted.python.failure import Failure
+from twisted.internet import reactor
+from twisted.python.runtime import seconds
+from itertools import count
+from Queue import Queue, Empty
+
+class TwistedManager(object):
+ def __init__(self):
+ self.twistedQueue = Queue()
+ self.key = count()
+ self.results = {}
+
+ def getKey(self):
+ # get a unique identifier
+ return self.key.next()
+
+ def start(self):
+ # start the reactor
+ reactor.interleave(self.twistedQueue.put)
+
+ def _stopIterating(self, value, key):
+ self.results[key] = value
+
+ def stop(self):
+ # stop the reactor
+ key = self.getKey()
+ reactor.addSystemEventTrigger('after', 'shutdown',
+ self._stopIterating, True, key)
+ reactor.stop()
+ self.iterate(key)
+
+ def getDeferred(self, d):
+ # get the result of a deferred or raise if it failed
+ key = self.getKey()
+ d.addBoth(self._stopIterating, key)
+ res = self.iterate(key)
+ if isinstance(res, Failure):
+ res.raiseException()
+ return res
+
+ def poll(self, noLongerThan=1.0):
+ # poll the reactor for up to noLongerThan seconds
+ base = seconds()
+ try:
+ while (seconds() - base) <= noLongerThan:
+ callback = self.twistedQueue.get_nowait()
+ callback()
+ except Empty:
+ pass
+
+ def iterate(self, key=None):
+ # iterate the reactor until it has the result we're looking for
+ while key not in self.results:
+ callback = self.twistedQueue.get()
+ callback()
+ return self.results.pop(key)
+
+def fakeDeferred(msg):
+ d = Deferred()
+ def cb():
+ print "deferred called back"
+ d.callback(msg)
+ reactor.callLater(2, cb)
+ return d
+
+def fakeCallback():
+ print "twisted is still running"
+
+def main():
+ m = TwistedManager()
+ print "starting"
+ m.start()
+ print "setting up a 1sec callback"
+ reactor.callLater(1, fakeCallback)
+ print "getting a deferred"
+ res = m.getDeferred(fakeDeferred("got it!"))
+ print "got the deferred:", res
+ print "stopping"
+ m.stop()
+ print "stopped"
+
+
+if __name__ == '__main__':
+ main()