NX Lab

Hàng đợi xuất file có thử lại (retry) và nhật ký lỗi: xử lý sự cố mạng và file bị khóa

#Python#Hàng loạt#Độ tin cậy1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Ghi file vào ổ mạng đôi khi lỗi tạm thời: file bị khóa, ổ mạng ngắt vài giây. Hàm thử lại có chờ tăng dần giúp tác vụ hàng loạt vượt qua các lỗi tạm thời mà không cần người can thiệp.

    Hàng đợi xuất file có thử lại (retry) và… Hàng đợi xuất file có thử lại (retry) và…

    Các bước thực hiện

    1. Bọc thao tác. Hàm thử lại nhận hàm thao tác và số lần tối đa.
    2. Chờ tăng dần. 1, 2, 4, 8 giây (exponential backoff).
    3. Phân biệt lỗi. Lỗi dữ liệu không thử lại, lỗi I/O thì thử lại.
    4. Ghi nhật ký. Mỗi lần thử một dòng.
    5. Tổng kết. Danh sách mục thất bại cuối cùng.

    Code tham khảo (Python)

    import os
    import time
    import NXOpen
    
    LOI_TAM_THOI = (PermissionError, OSError)
    
    def thu_lai(ham, so_lan=4, cho_dau=1.0, ghi=None):
        cho = cho_dau
        for lan in range(1, so_lan + 1):
            try:
                return ham()
            except LOI_TAM_THOI as ex:
                if ghi:
                    ghi("  lần %d/%d lỗi tạm thời: %s" % (lan, so_lan, ex))
                if lan == so_lan:
                    raise
                time.sleep(cho)
                cho *= 2
    
    def ghi_van_ban(duong_dan, noi_dung):
        os.makedirs(os.path.dirname(duong_dan), exist_ok=True)
        with open(duong_dan, "w", encoding="utf-8") as f:
            f.write(noi_dung)
        return duong_dan
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        muc_tieu = "D:/NXLab_xuat/trang_thai_%s.txt" % part.Leaf
        ghi = lw.WriteLine
        try:
            thu_lai(lambda: ghi_van_ban(muc_tieu, "Part: %s\nGiờ: %s\n" % (part.Leaf, time.strftime("%H:%M:%S"))),
                    so_lan=4, cho_dau=0.5, ghi=ghi)
            lw.WriteLine("Đã ghi: " + muc_tieu)
        except Exception as ex:
            lw.WriteLine("Thất bại sau nhiều lần thử: %s" % ex)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Chỉ lỗi I/O (OSError, PermissionError) được thử lại; lỗi lập trình hoặc dữ liệu sẽ nổ ngay để bạn sửa.
    • Thời gian chờ nhân đôi sau mỗi lần để không dồn dập vào ổ mạng đang quá tải.
    • Hàm ghi truyền từ ngoài nên dùng được cả cho Listing Window lẫn file log.

    Lỗi thường gặp

    • Không thử lại mãi: giới hạn số lần để script không treo hàng giờ.
    • Hành động thử lại phải bất biến (ghi đè được); thao tác chèn thêm dữ liệu sẽ bị nhân đôi.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.