Quá trình xử lý tài liệu đã hết thời gian, đừng để một tác vụ kéo xuống cả lô

Bản PDF được quét bị kẹt và 99 tác vụ tiếp theo sẽ không di chuyển. Việc thêm thời gian chờ vào yêu cầu dường như giải quyết được sự cố nhưng quá trình xử lý thực tế có thể vẫn đang tiêu tốn bộ nhớ ở chế độ nền. Hết thời gian chờ bao gồm ít nhất ba hành động: dừng chờ, dừng thực thi và đánh dấu sản phẩm là không thể gửi được.

Khi xử lý tài liệu theo lô, điều rắc rối nhất thường không phải là lỗi của một tệp mà là một tác vụ bị kẹt và tất cả các tác vụ tiếp theo đều bị dừng trong hàng đợi. Ví dụ: nếu bản PDF được quét bị kẹt thì 99 tác vụ tiếp theo sẽ không được thực hiện. Việc thêm thời gian chờ vào yêu cầu dường như giải quyết được vấn đề này.

Nhưng hết thời gian chờ không có nghĩa là nhiệm vụ đã kết thúc. Các quy trình có thể vẫn đang chạy ở chế độ nền và tiếp tục chiếm bộ nhớ hoặc sản phẩm có thể chỉ mới hoàn thành một nửa. Thời gian chờ bao gồm ít nhất ba hành động: dừng chờ, dừng thực thi và đánh dấu sản phẩm là không thể gửi được. Sau khi đọc bài viết này, bạn sẽ có thể xác định bằng chứng nào cần được ghi lại sau khi hết thời gian chờ, trong trường hợp nào thì thích hợp để thử lại và cách tách thời gian chờ của máy khách khỏi trạng thái tác vụ từ xa.

Bài viết này sử dụng các mẫu tổng hợp để trình bày phương pháp xử lý. Mã đã được kiểm tra bằng các ví dụ trong môi trường biệt lập và không đảm bảo cho tất cả các tệp thực hoặc hiệu suất sản phẩm. Trước khi xử lý các văn bản quan trọng, vui lòng giữ lại bản chính và xem xét theo ranh giới và các mục chấp nhận trong văn bản.

Kết luận một câu

Thời gian chờ của tác vụ hàng loạt nên được chia thành ba phần: dừng chờ, dừng thực thi và đánh dấu sản phẩm là không thể gửi được. "Hết thời gian chờ" không thể được coi trực tiếp là "nhiệm vụ đã kết thúc".

hoàn cảnh của bạnCác phương pháp được đề xuấtlý do
Chỉ muốn ngăn trang hoặc hàng đợi khỏi bị kẹtDừng chờ đợi và truy vấn trạng thái nhiệm vụ đã biếtDừng chờ không có nghĩa là tác vụ từ xa đã kết thúc
Lo lắng về các tiến trình nền chiếm bộ nhớXác nhận rằng việc chấm dứt đã hoàn tất và cách ly nó với một nhóm quy trình, vùng chứa hoặc đối tượng công việc nếu cần thiếtsubprocess.run(timeout=...) hợp lệ cho các tiến trình con trực tiếp và không thể khái quát hóa thành thực tế là toàn bộ cây quy trình đã được dọn sạch
Sản phẩm có thể là bán thành phẩmĐánh dấu sản phẩm tạm thời là không thể gửi được và không chia sẻ trạng thái với kết quả chính thứcKết quả của việc đến muộn sau khi hết thời gian chờ không thể trực tiếp biến nhiệm vụ thành thành công.
Hết thời gian chờ lặp lại cho cùng một đầu vàoCô lập các mẫu và kiểm tra độ phức tạp mà không cần thử lại không giới hạnThử lại chỉ có ý nghĩa nếu lỗi có thể phục hồi được và cuộc gọi có giá trị bình thường một cách thích hợp.

Chờ timeout không có nghĩa là công việc đã kết thúc

Thời gian chờ chỉ ảnh hưởng đến người gọi

subprocess.run(timeout=...) có thể hết thời gian chỉ đạo các tiến trình con, nhưng nó không đảm bảo rằng bất kỳ cây tiến trình nào đã được dọn sạch. Các hệ điều hành, phương pháp khởi động và hành vi của tiến trình cháu khác nhau sẽ ảnh hưởng đến kết quả. Để biết các hành vi liên quan, vui lòng tham khảo Hành vi hết thời gian chờ của các tiến trình con Python.

Môi trường sản xuất yêu cầu chiến lược cách ly

Việc triển khai sản xuất thường yêu cầu các phương tiện cách ly như nhóm quy trình, vùng chứa hoặc đối tượng công việc để đảm bảo rằng công việc liên quan thực sự dừng sau khi hết thời gian chờ.

Đầu tiên hãy viết rõ hợp đồng trạng thái nhiệm vụ

Phần sau chỉ mô phỏng kiểm tra trạng thái, không chạy lệnh bên ngoài hoặc cố ý tạm dừng tiến trình. Điểm mấu chốt của phần trình diễn là: sau khi đạt hạn chót, ngay cả khi một đơn vị công việc đến kết quả muộn, bạn không thể trực tiếp thay đổi một nhiệm vụ quá hạn thành thành công.

from dataclasses import dataclass

@dataclass(frozen=True)
class Decision:
    state: str
    deliver: bool
    terminate_requested: bool

def decide(now, deadline, worker_done, artifact_valid):
    if now >= deadline:
        return Decision("timed_out", False, not worker_done)
    if not worker_done:
        return Decision("processing", False, False)
    if not artifact_valid:
        return Decision("invalid_artifact", False, False)
    return Decision("verified", True, False)

assert decide(9, 10, False, False).state == "processing"
assert decide(10, 10, False, False).terminate_requested
assert not decide(11, 10, True, True).deliver
assert decide(9, 10, True, True).deliver
assert decide(9, 10, True, False).state == "invalid_artifact"

Lựa chọn giao thức này được coi là thời gian chờ khi đạt đến thời gian cắt. Bạn cũng có thể sử dụng một ranh giới khác, nhưng nó nên được ghi vào bài kiểm tra. So sánh thời gian thực nên sử dụng đồng hồ đơn âm phù hợp cho các khoảng thời gian tính toán, và không nên điều chỉnh múi giờ hệ thống hoặc đồng hồ treo tường để thay đổi ngân sách nhiệm vụ.

📊 So sánh cốt lõi

Hành độngGiải quyết vấn đềCác khu vực vẫn cần được chú ý
Đừng chờ nữaNgười gọi không còn bị kẹt nữaCông việc từ xa hoặc văn phòng sau có thể vẫn đang diễn ra
Dừng thực thiGiải phóng tài nguyên bị chiếm bởi các tiến trìnhYêu cầu chấm dứt không có nghĩa là bạn đã rút lui; cần xác nhận
Đánh dấu sản phẩm là không giao đượcNgăn ngừa việc giao nhầm sản phẩm bán thành phẩmNhà nước phải được tách biệt với kết quả chính thức

Bằng chứng nào còn lại sau khi thời gian kết thúc?

Sau khi thời gian chờ xảy ra, bạn không thể chỉ ghi lại một lần hết thời gian chờ trong nhật ký. Những thông tin sau đây có thể giúp bạn xác định vấn đề nằm ở đâu:

Những điều bạn cần biếtMục đíchLưu ý
Giai đoạn hết thời gian chờPhân biệt giữa tải xuống, phân tích cú pháp hoặc dịchKhông chỉ một lần hội ý
Việc chấm dứt có được xác nhận hay khôngNgăn chặn việc làm backend bị bỏ lại phía sauYêu cầu chấm dứt không có nghĩa là bạn đã rút lui
Nhận diện sản phẩm tạm thờiTránh giao nhầm sản phẩm chưa hoàn thiệnKhông chia sẻ trạng thái với kết quả chính thức
Số lần thử lạiKiểm soát tổng ngân sáchBạn không thể lấy lại thời gian không giới hạn mỗi lần

Thử lại không phải là bước tiếp theo tự động

Khi tài nguyên liên tục bị cạn kiệt ở cùng một bước, hãy kiểm tra trước

Nếu cùng một đầu vào sử dụng tài nguyên ở cùng một bước mỗi lần, hãy tách mẫu và kiểm tra các vấn đề về độ phức tạp thay vì thử lại.

Phân biệt giữa hai loại đầu tip

Người dùng nên có khả năng phân biệt giữa hai kịch bản:

  • Dịch vụ bận, đang thử lại: Bạn có thể chờ.
  • Không hỗ trợ đầu vào, cần xử lý: Yêu cầu can thiệp thủ công hoặc thay thế đầu vào.

🎯 Phương pháp nào phù hợp với bạn?

Nếu bạn đang xử lý khối lượng lớn tài liệu

Mỗi nhiệm vụ được đặt thời gian cắt độc lập; khi một nhiệm vụ vượt hạn, chỉ nó tự đánh dấu, ngăn toàn bộ lô bị dừng.

Nếu bạn lo lắng về rò rỉ tài nguyên

Sau khi hết thời gian, xác nhận xem việc kết thúc có thực sự hoàn tất hay không, và cô lập ở cấp độ container hoặc nhóm tiến trình, thay vì chỉ dựa vào các thời gian chờ từ các tiến trình con trực tiếp.

Nếu bạn muốn kết nối với các nền tảng dịch thuật trực tuyến

Thời gian chờ của máy khách, trạng thái xử lý nền tảng và trạng thái tải tệp nên được thể hiện riêng biệt. Trước khi nhấp lại, hãy kiểm tra các tác vụ đã biết để tránh sử dụng trùng lặp.

❓ Câu hỏi thường gặp (FAQ)

1. Nếu một yêu cầu bị hết thời gian, tại sao lại dừng thực thi?

Sau thời gian chờ, quá trình xử lý có thể vẫn đang chạy nền và tiêu tốn bộ nhớ; việc dừng chờ không tự động giải phóng các tài nguyên này.

2. Nhiệm vụ có chắc chắn sẽ thất bại sau khi hết thời gian chờ không?

Không hẳn vậy. Tuy nhiên, nếu nhiệm vụ bị trì hoãn sau thời gian chờ, không thể chuyển trực tiếp thành nhiệm vụ thành công; nó phải được xác định theo hợp đồng trạng thái.

3. Khi nào thì nên thử lại?

Thử lại chỉ có ý nghĩa khi nguyên nhân thất bại có thể được khôi phục và cuộc gọi có tính đồng tính phù hợp. Nếu cùng một đầu vào tiêu hao tài nguyên ở cùng một bước mỗi lần, nên thực hiện cách ly và khắc phục sự cố trước.

4. Bằng chứng nào nên được ghi lại sau khi thời gian kết thúc?

Tối thiểu, ghi lại giai đoạn hết thời gian, xem việc kết thúc đã được xác nhận chưa, danh tính sản phẩm tạm thời, và số lần thử lại cần thiết.

📝 Tóm tắt

Chìa khóa của timeout là tách biệt "ngừng chờ", "ngừng thực thi" và "liệu sản phẩm có thể giao hàng hay không." Khi trạng thái nhiệm vụ đã được giải thoát, các lô sẽ không bị kéo xuống bởi một tệp duy nhất.

Trải nghiệm ngay: Tải lên tài liệu của bạn để bắt đầu dịch, giữ nguyên định dạng gốc

Cập nhật lúc 2026-11-15