mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-07-08 08:09:59 +00:00
688c3af674
- Bug 1235021 - Re-emit ChromeManifestEntries from the jar manifest handler code in the FasterMake backend. r=gps (a8d899a6da)
- Bug 1233282 - Make CONFIGURE_DEFINE_FILES considered more as GENERATED_FILES in the emitter. r=gps (d29506fb55)
- Bug 1235021 - Add a RenamedSourcePath helper class. r=gps (62e78b867b)
- Bug 1235021 - Re-emit FinalTarget{,Preprocessed}Files from the jar manifest handler code in the FasterMake backend. r=gps (c37287a5d7)
- Bug 1235021 - Avoid passing defines to FasterMakeBackend._consume_jar_manifest. r=gps (dc0d17c3a6)
- Bug 1235021 - Move FasterMakeBackend._consume_jar_manifest to CommonBackend. r=gps (b9bb6b7d1e)
- Bug 1239217 - Add the notion of Partial and Hybrid build backends. r=gps Make the FasterMake backend a partial build backend. (219c0811e6)
- Bug 1239217 - Stop making the FasterMake build system refresh the backend on its own. r=gps (4f79f966ce)
- Bug 1241398 - Show the diff for created and deleted files in `mach build-backend --diff`. r=gps (d497d3aef8)
- Bug 1214885 - Add a "ChromeUrl" build backend to write out information useful for resolving chrome urls. r=glandium (83ad13d109)
- Bug 1216817 - Part 1: Add install_callback to artifacts. r=gps (95b4860d09)
- Bug 1216817 - Part 2: Narrow distdir to bindir in artifacts. r=gps (e48b531455)
- Bug 1216817 - Part 4: Add --enable-artifact-builds and MOZ_ARTIFACT_BUILDS. r=glandium (8d7ed76621)
- bug 1164816 - Import concurrent.futures into the tree. r=gps (bc83211833)
- bug 1190603 - import PyECC library r=gps,gerv (e0c5afeee0)
- Bug 1216817 - Part 5: Run |mach artifact install| automatically when asked. r=glandium (835c27d9c2)
- Bug 1216817 - Follow-up: Fix "KeyError: uMOZ_ARTIFACT_BUILDS" in config.status. r=bustage (e87e04e23b)
- Bug 1216817 - Follow-up: Fix "KeyError: u'MOZ_ARTIFACT_BUILDS'". r=bustage (797331293b)
- Bug 1207897 - Add a configure option to build multiple build backends. r=gps (35f62c27ca)
- Bug 1241398 - Allow to pass the --verbose flag down to config.status from `mach build-backend`. r=gps (78610c40d0)
- Bug 1236111 - part 1: avoid configure.in Windows-only goop when running with disable-compile-environment, r=gps (d27a7e522a)
- Bug 1236111 - part 2: fix mozbuild to use the file mode modifiers specified for opening when writing a FileAvoidWrite, r=gps,nalexander (e240c613b7)
- Bug 1207890 - Part 1: Add rich ArtifactJob extension point. r=glandium (e402f5fcec)
- Bug 1207890 - Part 2: Stop extracting build ID from artifacts. r=glandium (314d6895c1)
- Bug 1207890 - Part 3: Post-process downloaded artifacts. r=glandium (09d60ac030)
- Bug 1207890 - Part 4: Download and process Mac OS X artifacts. r=glandium (181ba370b1)
- Bug 1207890 - Pre: Make JarWriter handle inputs with read() but not seek(). r=glandium (6ebb5dfe94)
- Bug 1207890 - Post: Hacks to make --disable-compile-environment work on Mac OS X. r=glandium (c5f88b6adf)
- Bug 1207890 - Post: Move |mach artifact| command out of mobile/android. r=glandium (a06f97dfb9)
- Bug 1207890 - Post: Hack to make |mach run| for Mac OS X artifact builds. r=me (4c6d2f6bfe)
- Bug 1207890 - Follow-up: Fix |mach artifact install| for mobile/android. r=me (a2e4347ca9)
- Bug 1236111 - part 3: ensure calls to hg and mach work on Windows, and that we use the right file mode when writing artifacts, r=nalexander,gps (d0090a5a56)
- Bug 1236111 - part 4: actually add Windows support to artifact code, r=nalexander,gps (ab40057ffa)
- Bug 1236111 - part 0: improve logging from process mixin, r=gps (d85265c134)
- Bug 1241398 - Add a dry-run mode to mach build-backend. r=gps (b300169915)
- Bug 1239217 - Make the RecursiveMake build system create backend files generically. r=gps (fba90d6bcb)
- fix minor misspatch of 1240990 (b7d44692bc)
- Bug 1239296 - Use telemetry_handler to store build resource data r=gps (58d7c3a260)
- Bug 1244143 - Record whether or not an artifact build was used in build telemetry data r=gps (d1821d1987)
- Bug 1246264 - Ensure cache directory exists for artifacts installation r=chmanchester (ef5c4a0fba)
- bug 1237619: save resource usage for "what" builds r=gps (6a311c71bc)
- Bug 1239296 - Add telemetry_handler function to mach context r=gps (4a7a67740d)
- Bug 1246402 - Environment variable to disable mercurial setup check. r=gps (d9cf129b6c)
- Bug 1239296 - add post_dispatch_handler hook to mach r=gps (aa55c9a36e)
- Bug 1236110 - Extend mach artifact to handle Linux Desktop builds. r=gps (cb29ca6d1d)
- Bug 1234912 - Check for mozext and pushlog entries after |mach artifact install| hg failure. r=gps (7bfb064c7c)
- Bug 1239096 - Improve English is artifacts.py comments. r=me (38aa5ecb19)
- Bug 1238320 - Part 1 (Linux): Download test binaries necessary to run xpcshell tests and mochitests in artifact builds. r=nalexander (f6407791ae)
- Bug 1238320 - Part 2 (Mac): Download test binaries necessary to run xpcshell tests and mochitests in artifact builds. r=nalexander (4d72cfc6f2)
- Bug 1238320 - Part 3 (Windows): Download test binaries necessary to run xpcshell tests and mochitests in artifact builds. r=nalexander# Please enter the commit message for your changes. Lines starting (40ac9f9f7d)
- Bug 1239678 - fix dll inclusion pattern on Windows and the placement of nested dlls like browsercomps and clearkey, r=nalexander (ad9015c9d9)
- Bug 1239738 - Handle artifact builds with no test binaries cleanly. r=ahunt (ba1593837a)
- Bug 1240323 - Fix installation of binary components in a subdir of dist/bin for linux artifact builds. r=nalexander (2f4b719ea3)
- Bug 1240239 - Install test plugins in artifact based builds. r=nalexander (edc24f4fd2)
- Bug 1240667 - Detect a tree to use for artifact builds based on recent changesets. r=nalexander (947879cb19)
- Bug 1244941 - Don't fill install manifest with artifacts. r=nalexander (8fa9793c53)
- Bug 1237619: Record build objects in resource_usage.json r=gps (c323d21c9f)
- bug 1237619: Add system and command metadata to resouce_usage.json r=gps (c93fb18c37)
- Bug 1240059 - Treat psutil as optional in record_resource_usage. r=gps (c91103ebce)
- Bug 1244160 - Create json-schema for build telemetry data r=gps (d8b3419cfd)
- Bug 1250624 - Overall system resources is displayed twice; r=chmanchester (a115c86902)
- Bug 1144842 (part 1) - Don't use MOZ_PROFILING before all the places it can be set. r=glandium. (3c12a2e29a)
- Bug 1144842 (part 2) - Make --enable-dmd imply --enable-profiling. r=glandium. (85c9ff5c32)
- Bug 1144842 (part 3) - Remove --enable-dmd code from js/src/configure.in. r=glandium. (52cf663bc7)
- Bug 1204260 - Pre: Don't expose ANDROID_{BUILD,PLATFORM}_TOOLS. r=glandium,gbrown (d4f560dd46)
- Bug 1219803 - Support 'mach run' for Android; r=jmaher (5a1a1ab16e)
- Bug 1219807 - Add tooltool manifests for jimdb; r=jmaher (4d7a211569)
- Bug 1221846 - Get Task Tracer building on desktop r=cyu. (5d1a0fabe9)
- Bug 1216681 - Add a fileid utility to extract the breakpad GUID from object files for identification in fix_stack_using_bpsyms. r=ted (e53eb5acc6)
- Bug 1237156 - Only build the fileid utility when MOZ_CRASHREPORTER is set. r=ted.mielczarek (328a80ae18)
- Bug 1239866 - Remove signaling standalone tests. r=bwc (b05b091059)
348 lines
13 KiB
ReStructuredText
348 lines
13 KiB
ReStructuredText
:mod:`concurrent.futures` --- Asynchronous computation
|
|
======================================================
|
|
|
|
.. module:: concurrent.futures
|
|
:synopsis: Execute computations asynchronously using threads or processes.
|
|
|
|
The :mod:`concurrent.futures` module provides a high-level interface for
|
|
asynchronously executing callables.
|
|
|
|
The asynchronous execution can be be performed by threads using
|
|
:class:`ThreadPoolExecutor` or seperate processes using
|
|
:class:`ProcessPoolExecutor`. Both implement the same interface, which is
|
|
defined by the abstract :class:`Executor` class.
|
|
|
|
Executor Objects
|
|
----------------
|
|
|
|
:class:`Executor` is an abstract class that provides methods to execute calls
|
|
asynchronously. It should not be used directly, but through its two
|
|
subclasses: :class:`ThreadPoolExecutor` and :class:`ProcessPoolExecutor`.
|
|
|
|
.. method:: Executor.submit(fn, *args, **kwargs)
|
|
|
|
Schedules the callable to be executed as *fn*(*\*args*, *\*\*kwargs*) and
|
|
returns a :class:`Future` representing the execution of the callable.
|
|
|
|
::
|
|
|
|
with ThreadPoolExecutor(max_workers=1) as executor:
|
|
future = executor.submit(pow, 323, 1235)
|
|
print(future.result())
|
|
|
|
.. method:: Executor.map(func, *iterables, timeout=None)
|
|
|
|
Equivalent to map(*func*, *\*iterables*) but func is executed asynchronously
|
|
and several calls to *func* may be made concurrently. The returned iterator
|
|
raises a :exc:`TimeoutError` if :meth:`__next__()` is called and the result
|
|
isn't available after *timeout* seconds from the original call to
|
|
:meth:`map()`. *timeout* can be an int or float. If *timeout* is not
|
|
specified or ``None`` then there is no limit to the wait time. If a call
|
|
raises an exception then that exception will be raised when its value is
|
|
retrieved from the iterator.
|
|
|
|
.. method:: Executor.shutdown(wait=True)
|
|
|
|
Signal the executor that it should free any resources that it is using when
|
|
the currently pending futures are done executing. Calls to
|
|
:meth:`Executor.submit` and :meth:`Executor.map` made after shutdown will
|
|
raise :exc:`RuntimeError`.
|
|
|
|
If *wait* is `True` then this method will not return until all the pending
|
|
futures are done executing and the resources associated with the executor
|
|
have been freed. If *wait* is `False` then this method will return
|
|
immediately and the resources associated with the executor will be freed
|
|
when all pending futures are done executing. Regardless of the value of
|
|
*wait*, the entire Python program will not exit until all pending futures
|
|
are done executing.
|
|
|
|
You can avoid having to call this method explicitly if you use the `with`
|
|
statement, which will shutdown the `Executor` (waiting as if
|
|
`Executor.shutdown` were called with *wait* set to `True`):
|
|
|
|
::
|
|
|
|
import shutil
|
|
with ThreadPoolExecutor(max_workers=4) as e:
|
|
e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
|
|
e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
|
|
e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
|
|
e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
|
|
|
|
|
|
ThreadPoolExecutor Objects
|
|
--------------------------
|
|
|
|
The :class:`ThreadPoolExecutor` class is an :class:`Executor` subclass that uses
|
|
a pool of threads to execute calls asynchronously.
|
|
|
|
Deadlock can occur when the callable associated with a :class:`Future` waits on
|
|
the results of another :class:`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)
|
|
|
|
.. class:: ThreadPoolExecutor(max_workers)
|
|
|
|
Executes calls asynchronously using at pool of at most *max_workers* threads.
|
|
|
|
.. _threadpoolexecutor-example:
|
|
|
|
ThreadPoolExecutor Example
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
::
|
|
|
|
from concurrent import futures
|
|
import urllib.request
|
|
|
|
URLS = ['http://www.foxnews.com/',
|
|
'http://www.cnn.com/',
|
|
'http://europe.wsj.com/',
|
|
'http://www.bbc.co.uk/',
|
|
'http://some-made-up-domain.com/']
|
|
|
|
def load_url(url, timeout):
|
|
return urllib.request.urlopen(url, timeout=timeout).read()
|
|
|
|
with futures.ThreadPoolExecutor(max_workers=5) as executor:
|
|
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())))
|
|
|
|
ProcessPoolExecutor Objects
|
|
---------------------------
|
|
|
|
The :class:`ProcessPoolExecutor` class is an :class:`Executor` subclass that
|
|
uses a pool of processes to execute calls asynchronously.
|
|
:class:`ProcessPoolExecutor` uses the :mod:`multiprocessing` module, which
|
|
allows it to side-step the :term:`Global Interpreter Lock` but also means that
|
|
only picklable objects can be executed and returned.
|
|
|
|
Calling :class:`Executor` or :class:`Future` methods from a callable submitted
|
|
to a :class:`ProcessPoolExecutor` will result in deadlock.
|
|
|
|
.. class:: ProcessPoolExecutor(max_workers=None)
|
|
|
|
Executes calls asynchronously using a pool of at most *max_workers*
|
|
processes. If *max_workers* is ``None`` or not given then as many worker
|
|
processes will be created as the machine has processors.
|
|
|
|
.. _processpoolexecutor-example:
|
|
|
|
ProcessPoolExecutor Example
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
::
|
|
|
|
import math
|
|
|
|
PRIMES = [
|
|
112272535095293,
|
|
112582705942171,
|
|
112272535095293,
|
|
115280095190773,
|
|
115797848077099,
|
|
1099726899285419]
|
|
|
|
def is_prime(n):
|
|
if n % 2 == 0:
|
|
return False
|
|
|
|
sqrt_n = int(math.floor(math.sqrt(n)))
|
|
for i in range(3, sqrt_n + 1, 2):
|
|
if n % i == 0:
|
|
return False
|
|
return True
|
|
|
|
def main():
|
|
with futures.ProcessPoolExecutor() as executor:
|
|
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
|
|
print('%d is prime: %s' % (number, prime))
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
Future Objects
|
|
--------------
|
|
|
|
The :class:`Future` class encapulates the asynchronous execution of a callable.
|
|
:class:`Future` instances are created by :meth:`Executor.submit`.
|
|
|
|
.. method:: Future.cancel()
|
|
|
|
Attempt to cancel the call. If the call is currently being executed then
|
|
it cannot be cancelled and the method will return `False`, otherwise the call
|
|
will be cancelled and the method will return `True`.
|
|
|
|
.. method:: Future.cancelled()
|
|
|
|
Return `True` if the call was successfully cancelled.
|
|
|
|
.. method:: Future.running()
|
|
|
|
Return `True` if the call is currently being executed and cannot be
|
|
cancelled.
|
|
|
|
.. method:: Future.done()
|
|
|
|
Return `True` if the call was successfully cancelled or finished running.
|
|
|
|
.. method:: Future.result(timeout=None)
|
|
|
|
Return the value returned by the call. If the call hasn't yet completed then
|
|
this method will wait up to *timeout* seconds. If the call hasn't completed
|
|
in *timeout* seconds then a :exc:`TimeoutError` will be raised. *timeout* can
|
|
be an int or float.If *timeout* is not specified or ``None`` then there is no
|
|
limit to the wait time.
|
|
|
|
If the future is cancelled before completing then :exc:`CancelledError` will
|
|
be raised.
|
|
|
|
If the call raised then this method will raise the same exception.
|
|
|
|
.. method:: Future.exception(timeout=None)
|
|
|
|
Return the exception raised by the call. If the call hasn't yet completed
|
|
then this method will wait up to *timeout* seconds. If the call hasn't
|
|
completed in *timeout* seconds then a :exc:`TimeoutError` will be raised.
|
|
*timeout* can be an int or float. If *timeout* is not specified or ``None``
|
|
then there is no limit to the wait time.
|
|
|
|
If the future is cancelled before completing then :exc:`CancelledError` will
|
|
be raised.
|
|
|
|
If the call completed without raising then ``None`` is returned.
|
|
|
|
.. method:: Future.add_done_callback(fn)
|
|
|
|
Attaches the callable *fn* to the future. *fn* will be called, with the
|
|
future as its only argument, when the future is cancelled or finishes
|
|
running.
|
|
|
|
Added callables are called in the order that they were added and are always
|
|
called in a thread belonging to the process that added them. If the callable
|
|
raises an :exc:`Exception` then it will be logged and ignored. If the
|
|
callable raises another :exc:`BaseException` then the behavior is not
|
|
defined.
|
|
|
|
If the future has already completed or been cancelled then *fn* will be
|
|
called immediately.
|
|
|
|
Internal Future Methods
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The following :class:`Future` methods are meant for use in unit tests and
|
|
:class:`Executor` implementations.
|
|
|
|
.. method:: Future.set_running_or_notify_cancel()
|
|
|
|
This method should only be called by :class:`Executor` implementations before
|
|
executing the work associated with the :class:`Future` and by unit tests.
|
|
|
|
If the method returns `False` then the :class:`Future` was cancelled i.e.
|
|
:meth:`Future.cancel` was called and returned `True`. Any threads waiting
|
|
on the :class:`Future` completing (i.e. through :func:`as_completed` or
|
|
:func:`wait`) will be woken up.
|
|
|
|
If the method returns `True` then the :class:`Future` was not cancelled
|
|
and has been put in the running state i.e. calls to
|
|
:meth:`Future.running` will return `True`.
|
|
|
|
This method can only be called once and cannot be called after
|
|
:meth:`Future.set_result` or :meth:`Future.set_exception` have been
|
|
called.
|
|
|
|
.. method:: Future.set_result(result)
|
|
|
|
Sets the result of the work associated with the :class:`Future` to *result*.
|
|
|
|
This method should only be used by Executor implementations and unit tests.
|
|
|
|
.. method:: Future.set_exception(exception)
|
|
|
|
Sets the result of the work associated with the :class:`Future` to the
|
|
:class:`Exception` *exception*.
|
|
|
|
This method should only be used by Executor implementations and unit tests.
|
|
|
|
Module Functions
|
|
----------------
|
|
|
|
.. function:: wait(fs, timeout=None, return_when=ALL_COMPLETED)
|
|
|
|
Wait for the :class:`Future` instances (possibly created by different
|
|
:class:`Executor` instances) given by *fs* to complete. Returns a named
|
|
2-tuple of sets. The first set, named "done", contains the futures that
|
|
completed (finished or were cancelled) before the wait completed. The second
|
|
set, named "not_done", contains uncompleted futures.
|
|
|
|
*timeout* can be used to control the maximum number of seconds to wait before
|
|
returning. *timeout* can be an int or float. If *timeout* is not specified or
|
|
``None`` then there is no limit to the wait time.
|
|
|
|
*return_when* indicates when this function should return. It must be one of
|
|
the following constants:
|
|
|
|
+-----------------------------+----------------------------------------+
|
|
| Constant | Description |
|
|
+=============================+========================================+
|
|
| :const:`FIRST_COMPLETED` | The function will return when any |
|
|
| | future finishes or is cancelled. |
|
|
+-----------------------------+----------------------------------------+
|
|
| :const:`FIRST_EXCEPTION` | The function will return when any |
|
|
| | future finishes by raising an |
|
|
| | exception. If no future raises an |
|
|
| | exception then it is equivalent to |
|
|
| | `ALL_COMPLETED`. |
|
|
+-----------------------------+----------------------------------------+
|
|
| :const:`ALL_COMPLETED` | The function will return when all |
|
|
| | futures finish or are cancelled. |
|
|
+-----------------------------+----------------------------------------+
|
|
|
|
.. function:: as_completed(fs, timeout=None)
|
|
|
|
Returns an iterator over the :class:`Future` instances (possibly created by
|
|
different :class:`Executor` instances) given by *fs* that yields futures as
|
|
they complete (finished or were cancelled). Any futures given by *fs* that
|
|
are duplicated will be returned once. Any futures that completed
|
|
before :func:`as_completed` is called will be yielded first. The returned
|
|
iterator raises a :exc:`TimeoutError` if :meth:`~iterator.__next__` is
|
|
called and the result isn't available after *timeout* seconds from the
|
|
original call to :func:`as_completed`. *timeout* can be an int or float.
|
|
If *timeout* is not specified or ``None``, there is no limit to the wait
|
|
time.
|