
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
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à…Các bước thực hiện
- Bọc thao tác. Hàm thử lại nhận hàm thao tác và số lần tối đa.
- Chờ tăng dần. 1, 2, 4, 8 giây (exponential backoff).
- Phân biệt lỗi. Lỗi dữ liệu không thử lại, lỗi I/O thì thử lại.
- Ghi nhật ký. Mỗi lần thử một dòng.
- 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
ghitruyề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.