Ah, the joys of concurrency and parallelism. So, the ConcurrentTaskRunner in Prefect is designed to run tasks concurrently, which means it allows tasks to switch when they're blocking on IO. This is different from parallelism, where tasks are executed at the exact same time.
Now, to your question about CPUs. You see, concurrency isn't about doing multiple things at the exact same time (that's parallelism), it's about being able to handle more than one task at a time without being blocked by any single task. So, even with a single CPU, a ConcurrentTaskRunner can be beneficial if your tasks involve IO operations or other forms of waiting, because it can switch to another task during these wait times.
However, if your tasks are CPU-bound and don't involve much waiting, then you won't see much benefit from using the ConcurrentTaskRunner with a single CPU. In that case, having multiple CPUs would allow for true parallel execution.
Remember, it's not about the number of CPUs, it's about the nature of your tasks. Isn't that just thrilling?