]> granicus.if.org Git - python/commitdiff
asyncio doc: add one more example of coroutines
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 3 Dec 2013 16:37:31 +0000 (17:37 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 3 Dec 2013 16:37:31 +0000 (17:37 +0100)
Doc/library/asyncio-task.rst

index e55f962d857da995a5a82173b94bfb7961e3ecb3..3c031a031a3123d5976ac06323f274f0f62a4a13 100644 (file)
@@ -231,10 +231,14 @@ Task functions
       the timeout occurs are returned in the second set.
 
 
+Examples
+--------
+
+
 .. _asyncio-hello-world-coroutine:
 
 Example: Hello World (coroutine)
---------------------------------
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Print ``Hello World`` every two seconds, using a coroutine::
 
@@ -253,3 +257,63 @@ Print ``Hello World`` every two seconds, using a coroutine::
 .. seealso::
 
    :ref:`Hello World example using a callback <asyncio-hello-world-callback>`.
+
+Example: Chains coroutines and parallel execution
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Example chaining coroutines and executing multiple coroutines in parallel::
+
+    import asyncio
+
+    @asyncio.coroutine
+    def compute(x, y):
+        print("Start computing %s + %s" % (x, y))
+        yield from asyncio.sleep(3.0)
+        return x + y
+
+    @asyncio.coroutine
+    def print_sum(x, y):
+        result = yield from compute(x, y)
+        print("%s + %s = %s" % (x, y, result))
+
+    @asyncio.coroutine
+    def wait_task(task):
+        while 1:
+            done, pending = yield from asyncio.wait([task], timeout=1.0)
+            if done:
+                break
+            print("Compute in progress...")
+        asyncio.get_event_loop().stop()
+
+    print("Schedule tasks")
+    task = asyncio.async(print_sum(1, 2))
+    asyncio.async(wait_task(task))
+
+    print("Execute tasks")
+    loop = asyncio.get_event_loop()
+    loop.run_forever()
+    loop.close()
+
+
+
+Output::
+
+    Schedule tasks
+    Execute tasks
+    Start computing 1 + 2
+    Compute in progress...
+    Compute in progress...
+    1 + 2 = 3
+
+Details:
+
+* ``compute()`` is chained to ``print_sum()``: ``print_sum()`` coroutine waits
+  until ``compute()`` is complete. Coroutines are executed in parallel:
+  ``wait_task()`` is executed while ``compute()`` is blocked in
+  ``asyncio.sleep(3.0)``.
+
+* Coroutines are not executed before the loop is running: ``"Execute tasks"``
+  is written before ``"Start computing 1 + 2"``.
+
+* ``wait_task()`` stops the event loop when ``print_sum()`` is done.
+