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