| 
									
										
										
										
											2013-12-20 14:37:39 -05:00
										 |  |  | .. currentmodule:: asyncio
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-01 03:18:58 +01:00
										 |  |  | .. _asyncio-sync:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | Synchronization Primitives
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 19:18:46 -04:00
										 |  |  | **Source code:** :source:`Lib/asyncio/locks.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -----------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | asyncio synchronization primitives are designed to be similar to
 | 
					
						
							|  |  |  | those of the :mod:`threading` module with two important caveats:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * asyncio primitives are not thread-safe, therefore they should not
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |   be used for OS thread synchronization (use :mod:`threading` for
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |   that);
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | * methods of these synchronization primitives do not accept the *timeout*
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |   argument; use the :func:`asyncio.wait_for` function to perform
 | 
					
						
							|  |  |  |   operations with timeouts.
 | 
					
						
							| 
									
										
										
										
											2017-07-25 17:03:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-21 01:06:38 +02:00
										 |  |  | asyncio has the following basic synchronization primitives:
 | 
					
						
							| 
									
										
										
										
											2015-01-30 00:37:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | * :class:`Lock`
 | 
					
						
							|  |  |  | * :class:`Event`
 | 
					
						
							|  |  |  | * :class:`Condition`
 | 
					
						
							| 
									
										
										
										
											2015-02-25 13:55:43 +01:00
										 |  |  | * :class:`Semaphore`
 | 
					
						
							|  |  |  | * :class:`BoundedSemaphore`
 | 
					
						
							| 
									
										
										
										
											2022-03-25 23:01:21 +01:00
										 |  |  | * :class:`Barrier`
 | 
					
						
							| 
									
										
										
										
											2015-01-30 00:37:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ---------
 | 
					
						
							| 
									
										
										
										
											2015-01-30 00:37:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | Lock
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | ====
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. class:: Lock()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    Implements a mutex lock for asyncio tasks.  Not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    An asyncio lock can be used to guarantee exclusive access to a
 | 
					
						
							|  |  |  |    shared resource.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    The preferred way to use a Lock is an :keyword:`async with`
 | 
					
						
							|  |  |  |    statement::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        lock = asyncio.Lock()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        # ... later
 | 
					
						
							|  |  |  |        async with lock:
 | 
					
						
							|  |  |  |            # access shared state
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    which is equivalent to::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        lock = asyncio.Lock()
 | 
					
						
							| 
									
										
										
										
											2015-02-26 10:39:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        # ... later
 | 
					
						
							|  |  |  |        await lock.acquire()
 | 
					
						
							|  |  |  |        try:
 | 
					
						
							|  |  |  |            # access shared state
 | 
					
						
							|  |  |  |        finally:
 | 
					
						
							|  |  |  |            lock.release()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: acquire()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Acquire the lock.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       This method waits until the lock is *unlocked*, sets it to
 | 
					
						
							|  |  |  |       *locked* and returns ``True``.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-29 19:08:17 +02:00
										 |  |  |       When more than one coroutine is blocked in :meth:`acquire`
 | 
					
						
							|  |  |  |       waiting for the lock to be unlocked, only one coroutine
 | 
					
						
							|  |  |  |       eventually proceeds.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Acquiring a lock is *fair*: the coroutine that proceeds will be
 | 
					
						
							|  |  |  |       the first coroutine that started waiting on the lock.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |    .. method:: release()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Release the lock.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       When the lock is *locked*, reset it to *unlocked* and return.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 18:28:19 -07:00
										 |  |  |       If the lock is *unlocked*, a :exc:`RuntimeError` is raised.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    .. method:: locked()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return ``True`` if the lock is *locked*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | Event
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | =====
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. class:: Event()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    An event object.  Not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    An asyncio event can be used to notify multiple asyncio tasks
 | 
					
						
							|  |  |  |    that some event has happened.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    An Event object manages an internal flag that can be set to *true*
 | 
					
						
							| 
									
										
										
										
											2020-12-23 05:44:52 -05:00
										 |  |  |    with the :meth:`~Event.set` method and reset to *false* with the
 | 
					
						
							|  |  |  |    :meth:`clear` method.  The :meth:`~Event.wait` method blocks until the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    flag is set to *true*.  The flag is set to *false* initially.
 | 
					
						
							| 
									
										
										
										
											2015-02-26 10:39:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  |    .. _asyncio_example_sync_event:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    Example::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       async def waiter(event):
 | 
					
						
							| 
									
										
										
										
											2018-09-13 18:28:19 -07:00
										 |  |  |           print('waiting for it ...')
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |           await event.wait()
 | 
					
						
							|  |  |  |           print('... got it!')
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       async def main():
 | 
					
						
							|  |  |  |           # Create an Event object.
 | 
					
						
							|  |  |  |           event = asyncio.Event()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |           # Spawn a Task to wait until 'event' is set.
 | 
					
						
							|  |  |  |           waiter_task = asyncio.create_task(waiter(event))
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |           # Sleep for 1 second and set the event.
 | 
					
						
							|  |  |  |           await asyncio.sleep(1)
 | 
					
						
							|  |  |  |           event.set()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # Wait until the waiter task is finished.
 | 
					
						
							|  |  |  |           await waiter_task
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: wait()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Wait until the event is set.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the event is set, return ``True`` immediately.
 | 
					
						
							| 
									
										
										
										
											2020-12-23 05:44:52 -05:00
										 |  |  |       Otherwise block until another task calls :meth:`~Event.set`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: set()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Set the event.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       All tasks waiting for event to be set will be immediately
 | 
					
						
							|  |  |  |       awakened.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: clear()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Clear (unset) the event.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-23 05:44:52 -05:00
										 |  |  |       Tasks awaiting on :meth:`~Event.wait` will now block until the
 | 
					
						
							|  |  |  |       :meth:`~Event.set` method is called again.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: is_set()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return ``True`` if the event is set.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | Condition
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | =========
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. class:: Condition(lock=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    A Condition object.  Not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    An asyncio condition primitive can be used by a task to wait for
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    some event to happen and then get exclusive access to a shared
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    resource.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    In essence, a Condition object combines the functionality
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    of an :class:`Event` and a :class:`Lock`.  It is possible to have
 | 
					
						
							|  |  |  |    multiple Condition objects share one Lock, which allows coordinating
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    exclusive access to a shared resource between different tasks
 | 
					
						
							|  |  |  |    interested in particular states of that shared resource.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    The optional *lock* argument must be a :class:`Lock` object or
 | 
					
						
							|  |  |  |    ``None``.  In the latter case a new Lock object is created
 | 
					
						
							|  |  |  |    automatically.
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    The preferred way to use a Condition is an :keyword:`async with`
 | 
					
						
							|  |  |  |    statement::
 | 
					
						
							| 
									
										
										
										
											2015-02-26 10:39:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        cond = asyncio.Condition()
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        # ... later
 | 
					
						
							|  |  |  |        async with cond:
 | 
					
						
							|  |  |  |            await cond.wait()
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    which is equivalent to::
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        cond = asyncio.Condition()
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        # ... later
 | 
					
						
							| 
									
										
										
										
											2019-02-14 10:39:25 +08:00
										 |  |  |        await cond.acquire()
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        try:
 | 
					
						
							|  |  |  |            await cond.wait()
 | 
					
						
							|  |  |  |        finally:
 | 
					
						
							| 
									
										
										
										
											2019-02-14 10:39:25 +08:00
										 |  |  |            cond.release()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    .. coroutinemethod:: acquire()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Acquire the underlying lock.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method waits until the underlying lock is *unlocked*,
 | 
					
						
							|  |  |  |       sets it to *locked* and returns ``True``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: notify(n=1)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-03 16:19:37 +00:00
										 |  |  |       Wake up *n* tasks (1 by default) waiting on this
 | 
					
						
							|  |  |  |       condition.  If fewer than *n* tasks are waiting they are all awakened.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       The lock must be acquired before this method is called and
 | 
					
						
							|  |  |  |       released shortly after.  If called with an *unlocked* lock
 | 
					
						
							|  |  |  |       a :exc:`RuntimeError` error is raised.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  |    .. method:: locked()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return ``True`` if the underlying lock is acquired.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |    .. method:: notify_all()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Wake up all tasks waiting on this condition.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       This method acts like :meth:`notify`, but wakes up all waiting
 | 
					
						
							|  |  |  |       tasks.
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       The lock must be acquired before this method is called and
 | 
					
						
							|  |  |  |       released shortly after.  If called with an *unlocked* lock
 | 
					
						
							|  |  |  |       a :exc:`RuntimeError` error is raised.
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    .. method:: release()
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Release the underlying lock.
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       When invoked on an unlocked lock, a :exc:`RuntimeError` is
 | 
					
						
							|  |  |  |       raised.
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: wait()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Wait until notified.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       If the calling task has not acquired the lock when this method is
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |       called, a :exc:`RuntimeError` is raised.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       This method releases the underlying lock, and then blocks until
 | 
					
						
							|  |  |  |       it is awakened by a :meth:`notify` or :meth:`notify_all` call.
 | 
					
						
							|  |  |  |       Once awakened, the Condition re-acquires its lock and this method
 | 
					
						
							|  |  |  |       returns ``True``.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-03 16:19:37 +00:00
										 |  |  |       Note that a task *may* return from this call spuriously,
 | 
					
						
							|  |  |  |       which is why the caller should always re-check the state
 | 
					
						
							| 
									
										
										
										
											2024-11-29 17:20:40 +01:00
										 |  |  |       and be prepared to :meth:`~Condition.wait` again. For this reason, you may
 | 
					
						
							|  |  |  |       prefer to use :meth:`~Condition.wait_for` instead.
 | 
					
						
							| 
									
										
										
										
											2024-02-03 16:19:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: wait_for(predicate)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Wait until a predicate becomes *true*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       The predicate must be a callable which result will be
 | 
					
						
							| 
									
										
										
										
											2024-02-03 16:19:37 +00:00
										 |  |  |       interpreted as a boolean value.  The method will repeatedly
 | 
					
						
							| 
									
										
										
										
											2024-11-29 17:20:40 +01:00
										 |  |  |       :meth:`~Condition.wait` until the predicate evaluates to *true*. The final value is the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       return value.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | Semaphore
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | =========
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. class:: Semaphore(value=1)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    A Semaphore object.  Not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    A semaphore manages an internal counter which is decremented by each
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    :meth:`acquire` call and incremented by each :meth:`release` call.
 | 
					
						
							|  |  |  |    The counter can never go below zero; when :meth:`acquire` finds
 | 
					
						
							|  |  |  |    that it is zero, it blocks, waiting until some task calls
 | 
					
						
							|  |  |  |    :meth:`release`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The optional *value* argument gives the initial value for the
 | 
					
						
							|  |  |  |    internal counter (``1`` by default). If the given value is
 | 
					
						
							|  |  |  |    less than ``0`` a :exc:`ValueError` is raised.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    The preferred way to use a Semaphore is an :keyword:`async with`
 | 
					
						
							|  |  |  |    statement::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        sem = asyncio.Semaphore(10)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        # ... later
 | 
					
						
							|  |  |  |        async with sem:
 | 
					
						
							|  |  |  |            # work with shared resource
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    which is equivalent to::
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |        sem = asyncio.Semaphore(10)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        # ... later
 | 
					
						
							|  |  |  |        await sem.acquire()
 | 
					
						
							|  |  |  |        try:
 | 
					
						
							|  |  |  |            # work with shared resource
 | 
					
						
							|  |  |  |        finally:
 | 
					
						
							|  |  |  |            sem.release()
 | 
					
						
							| 
									
										
										
										
											2015-02-26 10:39:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: acquire()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Acquire a semaphore.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       If the internal counter is greater than zero, decrement
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       it by one and return ``True`` immediately.  If it is zero, wait
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       until a :meth:`release` is called and return ``True``.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: locked()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Returns ``True`` if semaphore can not be acquired immediately.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 14:13:41 +03:00
										 |  |  |    .. method:: release()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |       Release a semaphore, incrementing the internal counter by one.
 | 
					
						
							|  |  |  |       Can wake up a task waiting to acquire the semaphore.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Unlike :class:`BoundedSemaphore`, :class:`Semaphore` allows
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       making more ``release()`` calls than ``acquire()`` calls.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | BoundedSemaphore
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | ================
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. class:: BoundedSemaphore(value=1)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    A bounded semaphore object.  Not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    Bounded Semaphore is a version of :class:`Semaphore` that raises
 | 
					
						
							|  |  |  |    a :exc:`ValueError` in :meth:`~Semaphore.release` if it
 | 
					
						
							|  |  |  |    increases the internal counter above the initial *value*.
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-25 23:01:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Barrier
 | 
					
						
							|  |  |  | =======
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 18:28:05 +01:00
										 |  |  | .. class:: Barrier(parties)
 | 
					
						
							| 
									
										
										
										
											2022-03-25 23:01:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    A barrier object.  Not thread-safe.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A barrier is a simple synchronization primitive that allows to block until
 | 
					
						
							|  |  |  |    *parties* number of tasks are waiting on it.
 | 
					
						
							|  |  |  |    Tasks can wait on the :meth:`~Barrier.wait` method and would be blocked until
 | 
					
						
							|  |  |  |    the specified number of tasks end up waiting on :meth:`~Barrier.wait`.
 | 
					
						
							|  |  |  |    At that point all of the waiting tasks would unblock simultaneously.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :keyword:`async with` can be used as an alternative to awaiting on
 | 
					
						
							|  |  |  |    :meth:`~Barrier.wait`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The barrier can be reused any number of times.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. _asyncio_example_barrier:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def example_barrier():
 | 
					
						
							|  |  |  |          # barrier with 3 parties
 | 
					
						
							|  |  |  |          b = asyncio.Barrier(3)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          # create 2 new waiting tasks
 | 
					
						
							|  |  |  |          asyncio.create_task(b.wait())
 | 
					
						
							|  |  |  |          asyncio.create_task(b.wait())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          await asyncio.sleep(0)
 | 
					
						
							|  |  |  |          print(b)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          # The third .wait() call passes the barrier
 | 
					
						
							|  |  |  |          await b.wait()
 | 
					
						
							|  |  |  |          print(b)
 | 
					
						
							|  |  |  |          print("barrier passed")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          await asyncio.sleep(0)
 | 
					
						
							|  |  |  |          print(b)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       asyncio.run(example_barrier())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Result of this example is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <asyncio.locks.Barrier object at 0x... [filling, waiters:2/3]>
 | 
					
						
							|  |  |  |       <asyncio.locks.Barrier object at 0x... [draining, waiters:0/3]>
 | 
					
						
							|  |  |  |       barrier passed
 | 
					
						
							|  |  |  |       <asyncio.locks.Barrier object at 0x... [filling, waiters:0/3]>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. coroutinemethod:: wait()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Pass the barrier. When all the tasks party to the barrier have called
 | 
					
						
							|  |  |  |       this function, they are all unblocked simultaneously.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       When a waiting or blocked task in the barrier is cancelled,
 | 
					
						
							|  |  |  |       this task exits the barrier which stays in the same state.
 | 
					
						
							|  |  |  |       If the state of the barrier is "filling", the number of waiting task
 | 
					
						
							|  |  |  |       decreases by 1.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The return value is an integer in the range of 0 to ``parties-1``, different
 | 
					
						
							|  |  |  |       for each task. This can be used to select a task to do some special
 | 
					
						
							|  |  |  |       housekeeping, e.g.::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          ...
 | 
					
						
							|  |  |  |          async with barrier as position:
 | 
					
						
							|  |  |  |             if position == 0:
 | 
					
						
							| 
									
										
										
										
											2022-06-06 19:10:42 +01:00
										 |  |  |                # Only one task prints this
 | 
					
						
							|  |  |  |                print('End of *draining phase*')
 | 
					
						
							| 
									
										
										
										
											2022-03-25 23:01:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       This method may raise a :class:`BrokenBarrierError` exception if the
 | 
					
						
							|  |  |  |       barrier is broken or reset while a task is waiting.
 | 
					
						
							|  |  |  |       It could raise a :exc:`CancelledError` if a task is cancelled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. coroutinemethod:: reset()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the barrier to the default, empty state.  Any tasks waiting on it
 | 
					
						
							|  |  |  |       will receive the :class:`BrokenBarrierError` exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If a barrier is broken it may be better to just leave it and create a new one.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. coroutinemethod:: abort()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Put the barrier into a broken state.  This causes any active or future
 | 
					
						
							| 
									
										
										
										
											2024-11-29 17:20:40 +01:00
										 |  |  |       calls to :meth:`~Barrier.wait` to fail with the :class:`BrokenBarrierError`.
 | 
					
						
							| 
									
										
										
										
											2022-06-06 17:39:51 +03:00
										 |  |  |       Use this for example if one of the tasks needs to abort, to avoid infinite
 | 
					
						
							| 
									
										
										
										
											2022-03-25 23:01:21 +01:00
										 |  |  |       waiting tasks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: parties
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The number of tasks required to pass the barrier.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: n_waiting
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The number of tasks currently waiting in the barrier while filling.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: broken
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       A boolean that is ``True`` if the barrier is in the broken state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. exception:: BrokenBarrierError
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This exception, a subclass of :exc:`RuntimeError`, is raised when the
 | 
					
						
							|  |  |  |    :class:`Barrier` object is reset or broken.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  | ---------
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-01 13:12:52 +02:00
										 |  |  | .. versionchanged:: 3.9
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 17:10:37 -07:00
										 |  |  |    Acquiring a lock using ``await lock`` or ``yield from lock`` and/or
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:00:05 +02:00
										 |  |  |    :keyword:`with` statement (``with await lock``, ``with (yield from
 | 
					
						
							| 
									
										
										
										
											2020-02-01 13:12:52 +02:00
										 |  |  |    lock)``) was removed.  Use ``async with lock`` instead.
 |