0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Tìm Hiểu Mã Bất Đồng Bộ Trong Python: Tăng Tốc Ứng Dụng Của Bạn

Đăng vào 3 tuần trước

• 5 phút đọc

Chủ đề:

PythonDevelopment

Mã Bất Đồng Bộ Trong Python: Tại Sao và Cách Sử Dụng Để Tăng Tốc Ứng Dụng

Bạn đã bao giờ nghe nói về thuật ngữ "bất đồng bộ" hay "asynchronous" mà nhiều lập trình viên thường nhắc đến không? Trong bài viết này, chúng ta sẽ cùng khám phá nghĩa của mã bất đồng bộ trong Python, lý do tại sao nó lại được ưa chuộng, cũng như hướng dẫn cách sử dụng nó để tối ưu hóa tốc độ mã của bạn.

Mã Đồng Bộ và Bất Đồng Bộ: Rùa và Thỏ Trong Lập Trình

1. Mã Đồng Bộ (Synchronous Code)

Mã đồng bộ là mã chạy từng dòng một theo thứ tự. Ví dụ, khi bạn lấy dữ liệu thời tiết cho Paris và London, mã sẽ lấy dữ liệu cho Paris trước, rồi mới di chuyển sang London. Phương pháp này tuy giúp mã dễ đọc nhưng lại gây chậm trễ, đặc biệt khi phải chờ đợi từng yêu cầu được hoàn thành. Dưới đây là ví dụ:

python Copy
import time

def get_weather_sync(city):
    print(f"Đang lấy dữ liệu thời tiết cho {city}...")
    time.sleep(2)  # Giả định chờ 2 giây để lấy dữ liệu
    print(f"Đã lấy dữ liệu cho {city}!")

get_weather_sync("Paris")
get_weather_sync("London")

Trong ví dụ này, việc lấy dữ liệu cho cả hai thành phố sẽ mất tổng cộng 4 giây.

2. Mã Bất Đồng Bộ (Asynchronous Code)

Ngược lại, mã bất đồng bộ không yêu cầu phải chờ đợi. Nếu đang lấy dữ liệu thời tiết cho Paris, mã có thể bắt đầu lấy dữ liệu thời tiết cho London cùng lúc. Điều này giống như việc bạn có thể làm nhiều việc cùng một lúc. Thư viện asyncio trong Python sẽ giúp bạn thực hiện điều này.

Dưới đây là một ví dụ đơn giản về mã bất đồng bộ:

python Copy
import asyncio

async def get_weather_async(city):
    print(f"Đang lấy dữ liệu thời tiết cho {city}...")
    await asyncio.sleep(2)  # Tạm dừng 2 giây
    print(f"Đã lấy dữ liệu cho {city}!")

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

asyncio.run(main())

Giờ đây, cả hai tác vụ sẽ hoàn thành trong khoảng 2 giây, giúp tiết kiệm thời gian đáng kể.

Lợi Ích Khi Sử Dụng Mã Bất Đồng Bộ Trong Python

Mã bất đồng bộ tỏ ra rất hiệu quả khi xử lý các tác vụ bị hạn chế bởi I/O. Những tác vụ này thường tốn nhiều thời gian chờ đợi như việc gọi API để lấy dữ liệu từ internet. Bằng cách sử dụng mã bất đồng bộ, chương trình của bạn có thể thực hiện nhiều hoạt động khác nhau trong thời gian chờ đợi, từ đó cải thiện hiệu suất của mã.

Thư Viện asyncio: Người Đồng Hành Đắc Lực Cho Mã Bất Đồng Bộ

Thư viện asyncio trong Python cung cấp các công cụ sau để viết mã bất đồng bộ:

  • async def: Định nghĩa hàm bất đồng bộ.
  • await: Tạm dừng hàm cho đến khi tác vụ hoàn thành.
  • asyncio.gather(): Chạy nhiều hàm bất đồng bộ cùng một lúc.

Xây Dựng Ứng Dụng Dự Báo Thời Tiết Đơn Giản

Chúng ta sẽ xây dựng một ứng dụng dự báo thời tiết đơn giản, lấy dữ liệu cho nhiều thành phố đồng thời theo hướng dẫn sau.

Bước 1: Cài Đặt

Đầu tiên, hãy cài đặt thư viện aiohttp để thực hiện các yêu cầu HTTP bất đồng bộ. Mở terminal và chạy:

bash Copy
pip install aiohttp

Bước 2: Viết Chương Trình Lấy Dữ Liệu Thời Tiết Bất Đồng Bộ

Chúng ta sẽ sử dụng API thời tiết miễn phí từ wttr.in để lấy thông tin thời tiết.

python Copy
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"Thời tiết ở {city}: {data}")

Bước 3: Chạy Các Hàm Async Cùng Nhau

Tiếp theo, hãy tạo hàm main để lấy dữ liệu thời tiết cho nhiều thành phố đồng thời.

python Copy
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)

# Bắt đầu vòng lặp sự kiện bất đồng bộ
asyncio.run(main())

Trong hàm main, chúng ta tạo danh sách các tác vụ cho từng thành phố và sử dụng asyncio.gather(*tasks) để chạy tất cả cùng lúc, giúp ứng dụng lấy dữ liệu nhanh chóng.

Bước 4: Chạy Ứng Dụng

Sau khi lưu mã của bạn, hãy chạy nó! Bạn sẽ thấy thông tin thời tiết cho tất cả các thành phố được in ra chỉ trong khoảng 2 giây. Dưới đây là toàn bộ mã để bạn tiện theo dõi:

python Copy
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"Thời tiết ở {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())

Kết Luận

Đó chính là cách bạn có thể xây dựng một ứng dụng dự báo thời tiết siêu tốc bằng cách áp dụng mã bất đồng bộ trong Python. Giờ đây, bạn đã có thể thu thập dữ liệu từ nhiều nguồn mà không làm chậm ứng dụng của mình. Bằng cách học cách sử dụng asyncio, bạn đã mở khóa tiềm năng của mã nhanh hơn và hiệu quả hơn. Hãy tiếp tục khám phá nhiều API hơn, xử lý thêm dữ liệu và tạo ra những ứng dụng tuyệt vời!

Cảm ơn bạn đã theo dõi!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào