DEV Community

ahmed elboshi
ahmed elboshi

Posted on

What is Asynchronous Code? How to Use It in Python to Speed Up Your Code Learn by Building a Weather App! ☀️🌦️

Hey there, future Python pro! 👋 So, you’ve probably heard the term “asynchronous” thrown around by developers like it’s some kind of magic spell. Today, we’re going to uncover the secrets of asynchronous code in Python, why it’s so awesome, and how to use it to speed up your code. And guess what? By the end, you’ll have built a nifty little weather app that requests data for multiple cities all at once. Let’s get to it!

Synchronous vs. Asynchronous Code

Before we dive in, let’s talk about synchronous and asynchronous code. These two types of code are like tortoises and hares 🐢🐇 of the programming world.

Synchronous Code

Synchronous code runs line-by-line. So, if you’re getting weather data for Paris and London, your code will first get Paris’ data, then wait until that’s done before moving on to London’s data. This makes your code simple to read, but it’s slow because it waits around doing nothing while each request finishes. Not ideal!

def get_weather_sync(city):
    # Imagine this function fetches weather data for a city
    print(f"Getting weather data for {city}...")
    # Pretend we wait here for the data
    time.sleep(2)
    print(f"Got data for {city}!")

get_weather_sync("Paris")
get_weather_sync("London")
Enter fullscreen mode Exit fullscreen mode

Here, each city takes 2 seconds, so getting both takes a painful total of 4 seconds. 🥱

Asynchronous Code

Asynchronous code doesn’t wait around! If it’s fetching weather for Paris, it can also start fetching weather for London at the same time. It’s like having two arms: you can grab two things at once instead of one. This is where Python’s asyncio library comes in, letting you handle tasks concurrently.

Here’s a simple example of asynchronous code:

import asyncio

async def get_weather_async(city):
    print(f"Getting weather data for {city}...")
    await asyncio.sleep(2)
    print(f"Got data for {city}!")

async def main():
    await asyncio.gather(
        get_weather_async("Paris"),
        get_weather_async("London")
    )

asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

Now, both tasks are done in 2 seconds instead of 4. Speedy!

Why Use Asynchronous Code?

Asynchronous code shines when you’re dealing with I/O-bound tasks. These tasks spend a lot of time waiting, like fetching data over the internet. With asynchronous code, your program can perform other actions while waiting, making it faster and more efficient.

Meet asyncio: Your Asynchronous Sidekick

Python’s asyncio library lets you write asynchronous code with a few powerful tools:

  • async def: Defines an asynchronous function.
  • await: Pauses the function until the awaited task is done.
  • asyncio.gather(): Runs multiple async functions at the same time.

Let’s Build a Weather App! 🌎⛅

Enough theory—let’s get our hands dirty! We’re going to make a simple weather app that gets data for multiple cities simultaneously.

Step 1: Set Up

First, you’ll need to install the aiohttp library, which helps with making async HTTP requests. Open your terminal and run:

pip install aiohttp
Enter fullscreen mode Exit fullscreen mode

Step 2: Write the Asynchronous Weather Fetcher

We’re going to use a free weather API, wttr.in, which gives us weather info just by calling a URL.

import asyncio
import aiohttp

async def fetch_weather(session, city):
    url = f"http://wttr.in/{city}?format=3"
    async with session.get(url) as response:
        data = await response.text()
        print(f"Weather in {city}: {data}")
Enter fullscreen mode Exit fullscreen mode

Here’s what’s happening:

  • We’re using aiohttp.ClientSession() to create a session for our requests.
  • The await response.text() line pauses our function until the data comes back.

Step 3: Run the Async Functions Together

Now, let’s add the main function that will fetch weather data for multiple cities simultaneously.

async def main():
    cities = ["Paris", "London", "New York", "Tokyo", "Sydney"]

    async with aiohttp.ClientSession() as session:
        tasks = [fetch_weather(session, city) for city in cities]
        await asyncio.gather(*tasks)

# Start the async event loop
asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

In the main function:

  • We create a list of tasks for each city.
  • asyncio.gather(*tasks) runs them all at once, so our weather app gets data super fast!

Step 4: Run Your App

Save your code, and then run it! You should see the weather for all cities printed out in about 2 seconds. Here’s the full code for your convenience:

import asyncio
import aiohttp

async def fetch_weather(session, city):
    url = f"http://wttr.in/{city}?format=3"
    async with session.get(url) as response:
        data = await response.text()
        print(f"Weather in {city}: {data}")

async def main():
    cities = ["Paris", "London", "New York", "Tokyo", "Sydney"]
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_weather(session, city) for city in cities]
        await asyncio.gather(*tasks)

asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

Wrapping Up 🎉

And there you have it! You just made a supercharged weather app using asynchronous code in Python. Now, you can fetch data from multiple sources without slowing down your program, like a pro!

By learning how to use asyncio, you’ve unlocked the power of faster, more efficient code. So, go ahead—explore more APIs, handle more data, and build cool stuff. The async world is yours! 🚀

Top comments (0)