Great question! When the semaphore limit is reached in this context, it means that the maximum number of concurrent operations (in this case, 5) is currently in progress. Semaphores in asyncio are used to limit the number of concurrent tasks that can access a particular resource. Here's how it works: When an async operation (in this case, the fetch_data function) tries to acquire the semaphore, it checks if the limit has been reached. If the limit hasn't been reached, the operation acquires the semaphore and continues execution. The operation is paused if the limit has been reached (it "waits"). It is not rejected or dropped - instead, it's placed in a queue. When one of the currently executing operations releases the semaphore (when it finishes execution), the next operation in the queue (if any) is resumed - it acquires the semaphore and continues execution. So to answer your question, the requests are not rejected to compete again. They are queued and wait for their turn to execute when the semaphore is available.