NX Lab

Xử lý hàng loạt song song bằng nhiều phiên run_journal: chia thư mục thành lô và chạy đồng thời

#Hàng loạt#Hiệu năng#run_journal1 lượt xem

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

    Câu hỏi ·

    Một phiên NX xử lý tuần tự; có máy mạnh và đủ giấy phép bạn có thể chạy nhiều run_journal cùng lúc, mỗi phiên một lô file. Script điều phối chạy bằng Python hệ thống, không phải trong NX.

    Xử lý hàng loạt song song bằng nhiều phiên… Xử lý hàng loạt song song bằng nhiều phiên…

    Chuẩn bị

    • Đủ số giấy phép NX cho số phiên chạy đồng thời.
    • Script xử lý một lô nhận danh sách file qua tham số dòng lệnh hoặc file danh sách.

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

    1. Liệt kê file. Quét thư mục .prt.
    2. Chia lô. Chia đều thành N lô.
    3. Ghi danh sách mỗi lô. File văn bản mỗi dòng một đường dẫn.
    4. Chạy song song. subprocess.Popen cho mỗi lô.
    5. Thu kết quả. Chờ tất cả xong, đọc mã thoát.

    Code tham khảo (Python)

    # dieu_phoi.py - chạy bằng Python hệ thống, KHÔNG chạy trong NX
    import os
    import subprocess
    import sys
    import tempfile
    
    RUN_JOURNAL = r"C:\Program Files\Siemens\NX 12.0\NXBIN\run_journal.exe"
    SCRIPT_LO = r"D:\NXLab\scripts\xu_ly_mot_lo.py"
    SO_PHIEN = 3
    
    def liet_ke_prt(thu_muc):
        ds = []
        for goc, _, files in os.walk(thu_muc):
            ds += [os.path.join(goc, f) for f in files if f.lower().endswith(".prt")]
        return sorted(ds)
    
    def chia_lo(ds, n):
        return [ds[i::n] for i in range(n) if ds[i::n]]
    
    def main(thu_muc):
        ds = liet_ke_prt(thu_muc)
        print("Tìm thấy %d file" % len(ds))
        thu_muc_tam = tempfile.mkdtemp(prefix="nxlab_lo_")
        tien_trinh = []
        for i, lo in enumerate(chia_lo(ds, SO_PHIEN), 1):
            file_ds = os.path.join(thu_muc_tam, "lo_%d.txt" % i)
            with open(file_ds, "w", encoding="utf-8") as f:
                f.write("\n".join(lo))
            # Truyền đường dẫn file danh sách cho script bằng -args
            lenh = [RUN_JOURNAL, SCRIPT_LO, "-args", file_ds]
            tien_trinh.append((i, subprocess.Popen(lenh)))
        ma_thoat = [(i, p.wait()) for i, p in tien_trinh]
        for i, ma in ma_thoat:
            print("Lô %d kết thúc, mã thoát %d" % (i, ma))
        return 0 if all(m == 0 for _, m in ma_thoat) else 1
    
    if __name__ == "__main__":
        sys.exit(main(sys.argv[1] if len(sys.argv) > 1 else r"D:\Du_an\ban_ve"))
    

    Giải thích code

    • ds[i::n] lấy mỗi phần tử thứ n bắt đầu từ i, chia đều các file cho n lô theo kiểu vòng tròn.
    • Tham số sau -args được script chạy trong NX đọc qua sys.argv.
    • Popen khởi chạy không chặn, nên các lô chạy đồng thời; wait() ở cuối chờ tất cả.

    Lỗi thường gặp

    • Mỗi phiên run_journal chiếm một giấy phép; chạy quá số cho phép làm các phiên sau lỗi hoặc chờ.
    • Nhiều phiên ghi cùng một file log/CSV sẽ chồng chéo; mỗi lô ghi file riêng rồi gộp sau.

    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.