Explain the difference between multi-threading and multi-processing in Python, specifically in the context of CPU-bound versus I/O-bound tasks.