If a function is not pure, it very likely has to be async.
Which just brings you back to preemptive multithreading, but without being able to use all the cores you paid for.