[pypy-svn] r34674 - pypy/dist/pypy/doc

arigo at codespeak.net arigo at codespeak.net
Thu Nov 16 15:58:16 CET 2006

Author: arigo
Date: Thu Nov 16 15:58:13 2006
New Revision: 34674

Tasklet example.

Modified: pypy/dist/pypy/doc/stackless.txt
--- pypy/dist/pypy/doc/stackless.txt	(original)
+++ pypy/dist/pypy/doc/stackless.txt	Thu Nov 16 15:58:13 2006
@@ -194,6 +194,44 @@
 is removed from the scheduling queue and will be reinserted when it
 becomes unblocked.
+Here is a many-producers many-consumers example, where any consumer can
+process the result of any producer.  For this situation we set up a
+single channel where all producer send, and on which all consumers
+    def producer(chan):
+        while True:
+            chan.send(...next value...)
+    def consumer(chan):
+        while True:
+            x = chan.receive()
+            ...do something with x...
+    # Set up the N producer and M consumer tasklets
+    common_channel = stackless.channel()
+    for i in range(N):
+        stackless.tasklet(producer, common_channel)()
+    for i in range(M):
+        stackless.tasklet(consumer, common_channel)()
+    # Run it all
+    stackless.run()
+Each item sent over the channel is received by one of the waiting
+consumers; which one is not specified.  The producers block until their
+item is consumed: the channel is not a queue, but rather a meeting point
+which causes tasklets to block until both a consumer and a producer are
+ready.  In practice, the reason for having several consumers receiving
+on a single channel is that some of the consumers can be busy in other
+ways part of the time.  For example, each consumer might receive a
+database request, process it, and send the result to a further channel
+before it asks for the next request.  In this situation, further
+requests can still be received by other consumers.

More information about the Pypy-commit mailing list