While certainly true that functional programming provides an intrinsic advantage to programming parallelism, parallelism is limited by hardware constraints. To best take advantage of CPU architectures,”function” execution needs to optimize usage of caching layers and execution threads. This naturally lends itself to the development of event loops/schedulers in functional runtimes like node and erlang.