mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Add entry for Barrier objects.
This commit is contained in:
parent
a3e8f3d85f
commit
5cee47f321
3 changed files with 46 additions and 5 deletions
|
@ -868,7 +868,7 @@ As an example, here is a simple way to synchronize a client and server thread::
|
||||||
constructor.
|
constructor.
|
||||||
|
|
||||||
The return value is an integer in the range 0 to *parties* -- 1, different
|
The return value is an integer in the range 0 to *parties* -- 1, different
|
||||||
for each thrad. This can be used to select a thread to do some special
|
for each thread. This can be used to select a thread to do some special
|
||||||
housekeeping, e.g.::
|
housekeeping, e.g.::
|
||||||
|
|
||||||
i = barrier.wait()
|
i = barrier.wait()
|
||||||
|
|
|
@ -817,7 +817,49 @@ collections
|
||||||
|
|
||||||
(Contributed by Raymond Hettinger.)
|
(Contributed by Raymond Hettinger.)
|
||||||
|
|
||||||
.. XXX threading.py and Barrier objects
|
threading
|
||||||
|
---------
|
||||||
|
|
||||||
|
The :mod:`threading` module has a new :class:`~threading.Barrier`
|
||||||
|
synchronization class for making multiple threads wait until all of them have
|
||||||
|
reached a common barrier point. Barriers are useful for making sure that a task
|
||||||
|
with multiple preconditions does not run until all of the predecessor tasks are
|
||||||
|
complete.
|
||||||
|
|
||||||
|
Barriers can work with an arbitrary number of threads. This is a generalization
|
||||||
|
of a `Rendezvous <http://en.wikipedia.org/wiki/Synchronous_rendezvous>`_ which
|
||||||
|
is defined for only two threads.
|
||||||
|
|
||||||
|
The barrier is designed to be cyclic, making it reusable once all of the
|
||||||
|
waiting threads are released.
|
||||||
|
|
||||||
|
If any of the predecessor tasks can hang or be delayed, a barrier can be created
|
||||||
|
with an optional *timeout* parameter. Then if the timeout period elapses before
|
||||||
|
all the predecessor tasks reach the barrier point, all waiting threads are
|
||||||
|
released and a :exc:`~threading.BrokenBarrierError` exception is raised.
|
||||||
|
|
||||||
|
Example of using barriers::
|
||||||
|
|
||||||
|
def get_votes(site):
|
||||||
|
ballots = conduct_election(site)
|
||||||
|
all_polls_closed.wait() # do not count until all polls are closed
|
||||||
|
summarize(ballots)
|
||||||
|
|
||||||
|
all_polls_closed = Barrier(len(sites))
|
||||||
|
for site in sites(get_votes(site)):
|
||||||
|
Thread(target=get_votes, args=(site,)).start()
|
||||||
|
|
||||||
|
In this example, the barrier enforces a rule that votes cannot be counted at any
|
||||||
|
polling site until all polls are closed. Notice how a solution with a barrier
|
||||||
|
is similar to one with :meth:`threading.Thread.join`, but the threads stay alive
|
||||||
|
and continue to do work (summarizing ballots) after the barrier point is
|
||||||
|
crossed.
|
||||||
|
|
||||||
|
See `Barrier Synchronization Patterns
|
||||||
|
<http://parlab.eecs.berkeley.edu/wiki/_media/patterns/paraplop_g1_3.pdf>`_
|
||||||
|
for more examples of how barriers can be used in parallel computing.
|
||||||
|
|
||||||
|
(Contributed by Kristján Valur Jónsson in :issue:`8777`.)
|
||||||
|
|
||||||
datetime
|
datetime
|
||||||
--------
|
--------
|
||||||
|
|
|
@ -17,12 +17,11 @@ from collections import deque
|
||||||
# with the multiprocessing module, which doesn't provide the old
|
# with the multiprocessing module, which doesn't provide the old
|
||||||
# Java inspired names.
|
# Java inspired names.
|
||||||
|
|
||||||
|
|
||||||
# Rename some stuff so "from threading import *" is safe
|
|
||||||
__all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
|
__all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
|
||||||
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread',
|
'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier',
|
||||||
'Timer', 'setprofile', 'settrace', 'local', 'stack_size']
|
'Timer', 'setprofile', 'settrace', 'local', 'stack_size']
|
||||||
|
|
||||||
|
# Rename some stuff so "from threading import *" is safe
|
||||||
_start_new_thread = _thread.start_new_thread
|
_start_new_thread = _thread.start_new_thread
|
||||||
_allocate_lock = _thread.allocate_lock
|
_allocate_lock = _thread.allocate_lock
|
||||||
_get_ident = _thread.get_ident
|
_get_ident = _thread.get_ident
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue