Exploring Python’s Asyncio for Concurrent Programming
Exploring Python’s Asyncio for Concurrent Programming
Python’s asyncio module provides a framework for writing concurrent code using asynchronous I/O, making it useful for tasks like network operations, database queries, and parallel execution without threads or multiprocessing.
1. Why Use Asyncio?
Traditional synchronous code blocks execution until a task completes. Asyncio allows non-blocking execution, meaning a program can continue running other tasks while waiting for an I/O operation to complete.
Best Use Cases:
✅ Network requests (HTTP APIs, WebSockets)
✅ Database queries (async drivers)
✅ File I/O operations
✅ Background tasks (e.g., web scraping, data processing)
2. Basics of Asyncio
a) Creating and Running an Async Function
An async function (also called a coroutine) runs asynchronously and must be awaited.
pythonimport asyncioasync def say_hello():
print("Hello")
await asyncio.sleep(1) # Simulates an I/O operation
print("World")
asyncio.run(say_hello()) # Runs the coroutine
b) Running Multiple Coroutines Concurrently
To execute multiple tasks concurrently, use asyncio.gather() or asyncio.create_task().
pythonimport asyncioasync def task(name, delay):
print(f"Task {name} started")
await asyncio.sleep(delay)
print(f"Task {name} completed")
async def main():
await asyncio.gather(task("A", 2), task("B", 1)) # Both run concurrently
asyncio.run(main())
💡 Key Takeaway: asyncio.gather() runs coroutines concurrently and waits for all to complete.
3. Asyncio with Tasks
Tasks allow scheduling coroutines to run in the background.
pythonasync def background_task():
await asyncio.sleep(2)
print("Background Task Done")async def main():
task = asyncio.create_task(background_task()) # Runs in the background
print("Main function continues execution...")
await asyncio.sleep(1) # Simulating other work
await task # Wait for background task
asyncio.run(main())
💡 Key Takeaway: asyncio.create_task() starts a coroutine without waiting for it to finish.
4. Using Asyncio for I/O Bound Operations
Asyncio shines when dealing with I/O operations like HTTP requests.
Example: Fetching Multiple URLs Asynchronously
pythonimport asyncio
import aiohttp # Async HTTP clientasync def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com", "https://httpbin.org/get"]
results = await asyncio.gather(*(fetch(url) for url in urls))
print("Fetched pages:", results)
asyncio.run(main())
💡 Key Takeaway: Async HTTP requests complete faster since multiple URLs are fetched concurrently.
5. Handling Exceptions in Asyncio
Handle exceptions properly to prevent tasks from failing silently.
pythonasync def faulty_task():
await asyncio.sleep(1)
raise ValueError("An error occurred")async def main():
try:
await faulty_task()
except ValueError as e:
print(f"Caught error: {e}")
asyncio.run(main())
6. Running Async Code in a Synchronous Environment
Since asyncio.run() can only be called once, use an event loop in synchronous environments (e.g., Jupyter Notebooks, existing scripts).
pythonimport asyncioloop = asyncio.get_event_loop()
loop.run_until_complete(say_hello()) # Runs async function in a sync environment
7. Asyncio vs. Multithreading vs. Multiprocessing
Feature Asyncio (Single-threaded)Multithreading Multiprocessing Best for I/O-bound tasks I/O-bound tasks CPU-bound tasks Parallelism Cooperative Preemptive True parallelism Overhead Low Medium High Example Web scraping, API calls GUI apps, networking CPU-heavy calculations
Conclusion
asyncio is a powerful tool for concurrent programming in Python, especially for I/O-bound tasks. By leveraging coroutines, tasks, and event loops, developers can write efficient and scalable applications. 🚀
WEBSITE: https://www.ficusoft.in/python-training-in-chennai/
Comments
Post a Comment