[Python-checkins] r78448 - peps/trunk/pep-3148.txt

guido.van.rossum python-checkins at python.org
Thu Feb 25 16:42:16 CET 2010


Author: guido.van.rossum
Date: Thu Feb 25 16:42:16 2010
New Revision: 78448

Log:
Update to PEP 3148 by Jeffrey Yasskin.


Modified:
   peps/trunk/pep-3148.txt

Modified: peps/trunk/pep-3148.txt
==============================================================================
--- peps/trunk/pep-3148.txt	(original)
+++ peps/trunk/pep-3148.txt	Thu Feb 25 16:42:16 2010
@@ -84,12 +84,13 @@
         future_to_url = dict((executor.submit(load_url, url, 60), url)
                              for url in URLS)
 
-    for future in futures.as_completed(future_to_url):
-        url = future_to_url[future]
-        if future.exception() is not None:
-            print('%r generated an exception: %s' % (url, future.exception()))
-        else:
-            print('%r page is %d bytes' % (url, len(future.result())))
+        for future in futures.as_completed(future_to_url):
+            url = future_to_url[future]
+            if future.exception() is not None:
+                print('%r generated an exception: %s' % (url,
+                                                         future.exception()))
+            else:
+                print('%r page is %d bytes' % (url, len(future.result())))
 
 Interface
 ---------
@@ -110,6 +111,8 @@
 Schedules the callable to be executed as fn(*\*args*, *\*\*kwargs*) and returns
 a `Future` instance representing the execution of the function.
 
+This is an abstract method and must be implemented by Executor subclasses.
+
 `map(func, *iterables, timeout=None)`
 
 Equivalent to map(*func*, *\*iterables*) but executed asynchronously and
@@ -158,6 +161,40 @@
 The `ThreadPoolExecutor` class is an `Executor` subclass that uses a pool of
 threads to execute calls asynchronously.
 
+Deadlock can occur when the callable associated with a `Future` waits on
+the results of another `Future`. For example:
+
+::
+
+    import time
+    def wait_on_b():
+        time.sleep(5)
+        print(b.result())  # b will never complete because it is waiting on a.
+        return 5
+
+    def wait_on_a():
+        time.sleep(5)
+        print(a.result())  # a will never complete because it is waiting on b.
+        return 6
+
+
+    executor = ThreadPoolExecutor(max_workers=2)
+    a = executor.submit(wait_on_b)
+    b = executor.submit(wait_on_a)
+
+And:
+
+::
+
+    def wait_on_future():
+        f = executor.submit(pow, 5, 2)
+        # This will never complete because there is only one worker thread and
+        # it is executing this function.
+        print(f.result())
+    
+    executor = ThreadPoolExecutor(max_workers=1)
+    executor.submit(wait_on_future)
+
 `__init__(max_workers)`
 
 Executes calls asynchronously using a pool of at most *max_workers* threads.
@@ -178,6 +215,10 @@
 
 Return `True` if the call was successfully cancelled.
 
+`Future.running()`
+
+Return `True` if the call is currently being executed and cannot be cancelled.
+
 `Future.done()`
 
 Return `True` if the call was successfully cancelled or finished running.
@@ -207,6 +248,37 @@
 
 If the call completed without raising then ``None`` is returned.
 
+Internal Future Methods
+^^^^^^^^^^^^^^^^^^^^^^^
+
+The following `Future` methods are meant for use in unit tests and `Executor`
+implementations.
+
+`set_running_or_notify_cancel()`
+
+Should be called by `Executor` implementations before executing the work
+associated with the `Future`.
+
+If the method returns `False` then the `Future` was cancelled i.e.
+`Future.cancel` was called and returned `True`. Any threads waiting on the
+`Future` completing (i.e. through `as_completed()` or `wait()`) will be woken
+up.
+
+If the method returns `True` then the `Future` was not cancelled and has been
+put in the running state i.e. calls to `Future.running()` will return `True`.
+
+This method can only be called once and cannot be called after
+`Future.set_result()` or `Future.set_exception()` have been called.
+
+`set_result(result)`
+
+Sets the result of the work associated with the `Future`.
+
+`set_exception(exception)`
+
+Sets the result of the work associated with the `Future` to the given
+`Exception`.
+   
 Module Functions
 ''''''''''''''''
 
@@ -313,7 +385,8 @@
    `http://www.mail-archive.com/stdlib-sig@python.org/msg00480.html`
 
 .. [6]
-   Reference `futures` implementation `http://code.google.com/p/pythonfutures`
+   Reference `futures` implementation
+   `http://code.google.com/p/pythonfutures/source/browse/#svn/branches/feedback`
 
 =========
 Copyright


More information about the Python-checkins mailing list