Dynamic task executor.
Inspired by golang runtime.
It is okay to do blocking inside a task, the executor will detect this, and scale the thread pool.
But, please keep note that every time you do blocking, it will
create thread via
thread::spawn, and the number of thread you can create
is not unlimited, so the number of blocking task you can
spawn is also not unlimited
Handle that you can
Block current thread until f is complete
Get the number of executor thread
Set the number of executor thread
Run the task in the background.