Start here. This is the direct spoken answer to practice first.
Overview
Chooses task synchronization by protected state, notification predicates, and limited capacity.
An asyncio Lock gives one task at a time access to a critical section. An Event broadcasts that some state has become true but does not protect the state itself. A Condition combines a lock with waiting for a state predicate to change. A Semaphore limits how many tasks enter a scarce operation concurrently. These primitives coordinate asyncio tasks and are not thread-safe OS-thread locks.