Start here. This is the direct spoken answer to practice first.
Overview
Shows how task interleaving across await points can violate a multi-step invariant.
Yes. One event-loop thread runs only one task at an instant, but tasks interleave whenever the running task suspends. If code reads shared state, awaits, then writes based on the old value, another task can change that state in between. The race is about an operation spanning several steps, not about two Python instructions literally executing at the same instant.