tăng user
Để tối ưu hóa mã nguồn hiện tại trong file z52-main.py giúp hệ thống không bị "nghẽn cổ chai" (treo kết nối) khi 60 user cùng nhấn Đăng nhập, Vào thi và Nộp bài cùng một lúc, bạn cần chỉnh sửa 2 khu vực chính sau đây:
1. Đoạn cần sửa đổi số 1: Cơ chế kết nối Database (Connection Pool)
Vị trí sửa: Thay thế hàm get_db_connection() ở ngay đầu file (sau khai báo DB_CONFIG).
Mã cũ của bạn:
DB_CONFIG = {
"host": "localhost",
"database": "quiz_questions",
"user": "postgres",
"password": "123456",
"port": "5432"
}
def get_db_connection(): return psycopg2.connect(**DB_CONFIG)
Thay bằng mã mới:
Thay vì mỗi Request của user lại mở một kết nối mới vào PostgreSQL (gây quá tải), ta dùng ThreadedConnectionPool để tạo sẵn một "bể chứa" kết nối dùng chung.
from psycopg2 import pool
from contextlib import contextmanager
DB_CONFIG = {
"host": "localhost",
"database": "quiz_questions",
"user": "postgres",
"password": "123456",
"port": "5432"
}
# Khởi tạo Pool chứa từ 10 đến 80 kết nối mở sẵn
db_pool = pool.ThreadedConnectionPool(10, 80, **DB_CONFIG)
@contextmanager
def get_db_connection():
"""Hàm quản lý kết nối an toàn, tự động trả kết nối về pool khi dùng xong"""
conn = db_pool.getconn()
try:
yield conn
finally:
db_pool.putconn(conn)
Tại sao phải sửa đoạn này? Nhờ sử dụng
@contextmanagervà cấu trúcyield, toàn bộ các đoạn code có lệnhwith get_db_connection() as conn:phía dưới trong filez52-main.pycủa bạn không cần phải sửa một dòng nào nữa. Kết nối sẽ tự động giải phóng về bể chứa sau khi chạy xong hàm route.
2. Đoạn cần sửa đổi số 2: Lệnh khởi chạy Server ở cuối file
Vị trí sửa: Đoạn block if __name__ == "__main__": ở cuối cùng của file z52-main.py.
Mã cũ của bạn:
# LỆNH KHỞI CHẠY SERVER (ĐẢM BẢO ĐOẠN LUYỆN TẬP Ở TRÊN PHẢI NẰM TRÊN DÒNG NÀY)
if __name__ == "__main__":
socketio.run(app, host="0.0.0.0", port=9000, debug=True)
Thay bằng mã mới:
Khi test tải với 60 user, bạn bắt buộc phải tắt chế độ debug=True (vì debug khiến Flask chạy đơn luồng, xử lý tuần tự từng người một, gây nghẽn) và cấu hình xử lý đa luồng (multi-threading).
# LỆNH KHỞI CHẠY SERVER (ĐÃ ĐƯỢC TỐI ƯU HÓA ĐỂ TEST TẢI ĐA LUỒNG)
if __name__ == "__main__":
# Tắt hoàn toàn debug khi test tải, cho phép luồng chạy song song
socketio.run(app, host="0.0.0.0", port=9000, debug=False, use_reloader=False)
💡 Cách môi trường vận hành thực tế khi mang ra phòng thi
Mặc dù việc đổi mã nguồn ở trên giúp server của bạn chạy song song tốt hơn trên máy cục bộ bằng lệnh python z52-main.py, nhưng để đạt hiệu năng gấp 5-10 lần khi 60 user thi thực tế, bạn nên chạy ứng dụng thông qua một WSGI server bất đồng bộ (chạy bằng Terminal/Command Prompt):
Cài đặt thư viện hỗ trợ xử lý hàng loạt kết nối SocketIO bằng Greenlet:
Bashpip install gevent gevent-websocket
2. Thay vì gõ lệnh chạy file python trực tiếp, bạn khởi chạy server bằng lệnh **Gunicorn** (trên Linux) hoặc dùng chính môi trường Python kết hợp với `gevent`:
```bash
# Nếu bạn deploy trên Linux Server:
gunicorn --worker-class gevent --workers 4 --bind 0.0.0.0:9000 z52-main:app
Sau khi sửa đúng 2 vị trí trên, hệ thống của bạn đã sẵn sàng để bạn bật Locust lên và tiến hành stress-test giả lập 60 người nộp bài cùng lúc mà không lo sập database hay treo Flask server! Bạn có gặp khó khăn gì khi viết file script test Locust không?

