How does asynchronous programming differ from multi-threading, and how would you implement it in Python or C++?