Bỏ qua tới nội dung chính
Quay lại tin tức

7 mẫu hình bất đồng bộ để chạy các tác nhân (agent) đồng thời trong Python

Machine Learning Mastery· Vinod Chugani· 11/8/2026general

Trong bài viết này, độc giả sẽ tìm hiểu bảy mẫu hình bất đồng bộ (async patterns) để chạy các tác nhân AI (AI agents) đồng thời trong Python, công dụng của từng mẫu hình và các yếu tố cấp độ sản xuất...

Bởi Vinod Chugani vào ngày 11 tháng 8 năm 2026 trong lĩnh vực Trí tuệ nhân tạo Trong bài viết này, độc giả sẽ tìm hiểu bảy mẫu hình bất đồng bộ để chạy các tác nhân AI đồng thời trong Python, mỗi mẫu hình phù hợp với trường hợp nào và những cạm bẫy cấp độ sản xuất cần lưu ý đối với từng mẫu hình. Các chủ đề sẽ được đề cập bao gồm: Các mẫu hình bất đồng bộ cốt lõi như "fire and forget" (chạy và quên), "scatter-gather" (phân tán-tập hợp), nhóm tác vụ và hàng đợi nhà sản xuất-người tiêu dùng, cùng với thời điểm nên sử dụng từng mẫu hình. Các kỹ thuật quản lý tài nguyên bao gồm áp lực ngược dựa trên semaphore và thực thi suy đoán, cùng với những đánh đổi thực tế của chúng. Cách xâu chuỗi các tác nhân thành các đường ống bất đồng bộ và giữ cho vòng lặp sự kiện hoạt động hiệu quả dưới tải. Việc điều phối một tác nhân AI duy nhất khá đơn giản. Tuy nhiên, việc duy trì một đội tác nhân chạy đồng thời mà không làm tắc nghẽn vòng lặp sự kiện hoặc gây ra lỗi giới hạn tốc độ dây chuyền lại là một vấn đề hoàn toàn khác. Thư viện `asyncio` của Python cung cấp các nguyên thủy để quản lý vấn đề này. Nhưng các mẫu hình được lựa chọn rất quan trọng. Mỗi mẫu hình giải quyết một vấn đề phối hợp khác nhau, và việc chọn sai có thể tạo ra các chế độ lỗi khó phát hiện và khó gỡ lỗi. Dưới đây là bảy mẫu hình bất đồng bộ để chạy các tác nhân đồng thời, cùng với những điểm cần lưu ý khi triển khai thực tế. 1. Fire and Forget (Thực thi nền tách rời) Người dùng khởi chạy một tác vụ tác nhân và tiếp tục mà không chờ đợi nó hoàn thành. Coroutine chạy ngầm trong khi luồng thực thi chính tiếp tục. Mẫu hình này hoạt động tốt khi kết quả của tác vụ không ảnh hưởng đến bất kỳ quy trình nào tiếp theo: ghi nhật ký, đẩy ngữ cảnh vào bộ nhớ hoặc kích hoạt một tác nhân dọn dẹp nền. Lưu ý: Các ngoại lệ trong các tác vụ tách rời sẽ bị vòng lặp sự kiện âm thầm bỏ qua. Nếu một tác nhân nền thất bại, không có gì cảnh báo người dùng trừ khi có một hàm gọi lại xử lý lỗi được gắn vào một cách rõ ràng. Cần tích hợp xử lý ngoại lệ trước khi coi bất kỳ tác vụ nào là an toàn để bỏ qua. 2. Strict Scatter-Gather (Phân tán-Tập hợp Nghiêm ngặt) Người dùng phân tán từ một tác nhân điều phối đến nhiều tác nhân worker đồng thời, sau đó chờ tất cả chúng trả về kết quả trước khi tiếp tục. `asyncio.gather()` ghép kênh các yêu cầu gửi đi và tập hợp kết quả theo thứ tự khởi chạy. Ví dụ: năm tác nhân truy vấn các nguồn dữ liệu khác nhau song song, với kết quả được thu thập sau khi tác nhân cuối cùng hoàn thành. Lưu ý: Theo mặc định, một lỗi duy nhất sẽ hủy bỏ phần còn lại. Ngay cả khi người dùng vô hiệu hóa hành vi đó, độ trễ của tác nhân chậm nhất vẫn áp dụng — toàn bộ hoạt động phải chờ tác nhân chậm nhất. Một lần tạo phản hồi chậm có thể gây tắc nghẽn mọi thứ khác. 3. Supervised Task Groups (Nhóm tác vụ được giám sát) Được giới thiệu trong Python 3.11, nhóm tác vụ cung cấp một phiên bản có cấu trúc của `gather`. Một trình quản lý ngữ cảnh làm cho phạm vi của các tác vụ đồng thời trở nên rõ ràng: khi khối lệnh kết thúc, tất cả các tác vụ đều đã hoàn thành hoặc bị hủy bỏ, và các lỗi sẽ xuất hiện ngay lập tức. Đối với các dự án mới trên Python 3.11 trở lên, nhóm tác vụ nhìn chung là lựa chọn rõ ràng hơn so với việc quản lý một tập hợp các tác vụ rời rạc theo cách thủ công. Lưu ý: Nhóm tác vụ hủy bỏ mạnh mẽ các tác vụ anh em khi có lỗi. Nếu một worker gặp lỗi giới hạn tốc độ, mọi tác nhân đang chạy khác sẽ bị hủy bỏ. Cần xây dựng logic thử lại bên trong các coroutine của từng tác nhân trước khi để các ngoại lệ lên đến cấp độ nhóm. 4. Producer-Consumer with Queues (Nhà sản xuất-Người tiêu dùng với hàng đợi) Không phải tất cả các tác nhân đều bắt đầu cùng một lúc. Đôi khi một tác nhân tạo ra công việc và các tác nhân khác xử lý nó, và một hàng đợi nằm giữa chúng như một bộ đệm. Các tác nhân sản xuất (producer agents) thêm các mục vào hàng đợi khi tìm thấy công việc. Các tác nhân tiêu thụ (consumer agents) độc lập lấy các mục từ hàng đợi. Hai bên không cần biết gì về nhau và có thể tăng hoặc giảm quy mô tác nhân tiêu thụ mà không ảnh hưởng đến tác nhân sản xuất. Lưu ý: Hàng đợi không giới hạn (unbounded queues) gây rò rỉ bộ nhớ một cách âm thầm. Nếu tác nhân sản xuất tạo ra tác vụ nhanh hơn khả năng xử lý của tác nhân tiêu thụ, hàng đợi sẽ tăng lên cho đến khi quy trình hết RAM. Hãy đặt kích thước hàng đợi tối đa để áp dụng cơ chế điều tiết (backpressure) lên tác nhân sản xuất. 5. Điều tiết thông qua Semaphores Bạn đặt một giới hạn cứng về số lượng tác nhân có thể truy cập một tài nguyên cùng lúc. Các tác nhân vượt quá giới hạn sẽ chờ đến lượt thay vì hoạt động đồng thời. Đây là một trong những mô hình thực tế nhất cho các hệ thống tác nhân trong môi trường sản xuất, nơi các API bên ngoài, nhóm kết nối cơ sở dữ liệu và các dịch vụ nội bộ đều có giới hạn thông lượng. Lưu ý: Semaphores giới hạn kết nối, không phải token. Bạn có thể giới hạn 10 yêu cầu đồng thời nhưng vẫn vượt quá giới hạn token mỗi phút của nhà cung cấp nếu cả 10 tác nhân cùng lúc tạo ra các đầu ra lớn. Để tuân thủ API nghiêm ngặt, hãy kết hợp semaphores với cơ chế điều tiết nhận biết token. 6. Thực thi suy đoán (Speculative Execution - First Completed Wins) Bạn cho nhiều tác nhân chạy đua để đạt cùng một mục tiêu và hủy bỏ các tác nhân thua cuộc ngay khi một tác nhân trả về kết quả hợp lệ. Điều này đánh đổi hiệu quả tính toán để lấy tốc độ. Một trường hợp sử dụng phổ biến là cho một mô hình nhỏ hơn, nhanh hơn chạy đua với một mô hình lớn hơn, chậm hơn và chấp nhận kết quả của mô hình nào hoàn thành trong mục tiêu độ trễ của bạn. Lưu ý: Hủy một tác vụ sẽ ngắt kết nối cục bộ của bạn nhưng không dừng quá trình tạo trên máy chủ của nhà cung cấp. Mô hình vẫn tiếp tục chạy và tiêu thụ token trong tài khoản của bạn ngay cả khi bạn đã chuyển sang tác vụ khác. Bạn phải trả tiền cho mọi tác nhân thua cuộc, mỗi lần. 7. Chuỗi đường ống bất đồng bộ (Asynchronous Pipeline Chaining) Mỗi tác nhân trong một chuỗi lấy đầu ra của tác nhân trước đó làm đầu vào. Tác nhân A tìm nạp dữ liệu thô, Tác nhân B làm sạch dữ liệu, Tác nhân C phân tích dữ liệu, Tác nhân D định dạng đầu ra. Điều này phù hợp với các đường ống truy xuất nhiều giai đoạn và quy trình suy luận, nơi mỗi giai đoạn có trách nhiệm riêng biệt, xử lý lỗi độc lập và có thể có các cài đặt mô hình khác nhau. Lưu ý: Việc truy vết lỗi ngược dòng qua chuỗi rất khó nếu không có công cụ giám sát (instrumentation). Đến khi Tác nhân D gặp sự cố với đầu vào không đúng định dạng, lỗi vi phạm lược đồ có thể đã bắt đầu từ Tác nhân A. Hãy chèn các định danh truy vết vào các tải trọng (payloads) được truyền giữa các giai đoạn. Thảo luận Dưới đây là một số gợi ý nhanh về việc chọn mô hình phù hợp: Các tác vụ độc lập, tất cả đều cần thiết: scatter-gather hoặc nhóm tác vụ. Các khối lượng công việc dạng luồng (streaming) hoặc khối lượng không xác định: producer-consumer với hàng đợi.

Nguồn tin: Machine Learning Mastery — Tác giả: Vinod Chugani. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.