(I know this has some time but I think it makes sense in context)
That is much easier said than done in real life when the whole project is doing by a team and you are stuck with whatever you all do in the group.
Even then, I prefer making my own programs with a mix of daemon and non-daemon threads to do the word. Daemon threads do work that can be interrupted at any time for any reason. Non-daemon threads are more well behaved and focus on doing their short job with hard IO.
In my case, the ThreadPoolExecutor does most of the work for me for these cases. Unfortunately, I think I'll have to implement my own for daemon threads.