การทำงานหลายเธรดใน Aspose.Slides สำหรับ Python
บทนำ
แม้ว่าการทำงานแบบขนานกับ presentation จะเป็นไปได้ (นอกจากการแยกวิเคราะห์/การโหลด/การคัดลอก) และส่วนใหญ่แล้วทุกอย่างทำงานได้ดี แต่ก็ยังมีโอกาสเล็กน้อยที่คุณอาจได้รับผลลัพธ์ที่ไม่ถูกต้องเมื่อใช้ไลบรารีในหลายเธรด
เราแนะนำอย่างยิ่งว่า ไม่ ควรใช้ออบเจกต์ Presentation เพียงหนึ่งตัวในสภาพแวดล้อมแบบหลายเธรด เนื่องจากอาจทำให้เกิดข้อผิดพลาดหรือความล้มเหลวที่ไม่คาดคิดและยากต่อการตรวจจับ
การโหลด, บันทึก, และ/หรือคัดลอกออบเจกต์ของคลาส Presentation ในหลายเธรด ไม่ ปลอดภัย การดำเนินการดังกล่าว ไม่ได้ รับการสนับสนุน หากคุณต้องการทำงานเหล่านี้ คุณต้องทำการประมวลผลแบบขนานโดยใช้หลายกระบวนการแบบเชิงลำดับเดียว และแต่ละกระบวนการควรใช้ออบเจกต์ presentation ของตนเอง
แปลงสไลด์ Presentation เป็นภาพแบบขนาน
สมมติว่าเราต้องการแปลงสไลด์ทั้งหมดจาก PowerPoint presentation เป็นรูปภาพ PNG แบบขนาน เนื่องจากไม่ปลอดภัยในการใช้ Presentation ตัวเดียวในหลายเธรด เราจึงแบ่งสไลด์ของ presentation ออกเป็นหลาย presentation แยกกันและแปลงสไลด์เป็นภาพแบบขนาน โดยใช้แต่ละ presentation ในเธรดแยกต่างหาก ตัวอย่างโค้ดต่อไปนี้แสดงวิธีทำเช่นนั้น
input_file_path = "sample.pptx"
output_file_path_template = "slide_{0}.png"
image_scale = 2
presentation = Presentation(input_file_path)
slide_count = len(presentation.slides)
slide_size = presentation.slide_size.size
conversion_tasks = []
def convert_slide(slide_index):
# ดึงสไลด์ i ไปยังงานนำเสนอแยกส่วน.
with Presentation() as slide_presentation:
slide_presentation.slide_size.set_size(slide_size.width, slide_size.height, SlideSizeScaleType.DO_NOT_SCALE)
slide_presentation.slides.remove_at(0)
slide_presentation.slides.add_clone(presentation.slides[slide_index])
slide_number = slide_index + 1
slide = slide_presentation.slides[0]
# แปลงสไลด์เป็นภาพ.
with slide.get_image(image_scale, image_scale) as image:
image_file_path = output_file_path_template.format(slide_number)
image.save(image_file_path, ImageFormat.PNG)
with ThreadPoolExecutor() as thread_executor:
for index in range(slide_count):
conversion_tasks.append(thread_executor.submit(convert_slide, index))
# รอให้งานทั้งหมดเสร็จสิ้น.
for task in conversion_tasks:
task.result()
del presentation
คำถามที่พบบ่อย
ฉันจำเป็นต้องเรียกตั้งค่าลิขสิทธิ์ในทุกเธรดหรือไม่?
ไม่ จำเป็นต้องทำครั้งเดียวต่อกระบวนการหรือโดเมนแอปก่อนที่เธรดจะเริ่มต้น หาก license setup อาจถูกเรียกพร้อมกัน (เช่นในระหว่างการเริ่มต้นแบบขี้เกียจ) ให้ซิงโครไนซ์การเรียกนั้นเนื่องจากเมธอดตั้งค่าลิขสิทธิ์เองไม่รองรับการทำงานแบบหลายเธรด
ฉันสามารถส่งออบเจกต์ Presentation หรือ Slide ระหว่างเธรดได้หรือไม่?
ไม่แนะนำให้ส่งออบเจกต์ presentation ที่กำลังใช้งานอยู่ระหว่างเธรด: ควรใช้อินสแตนซ์แยกแต่ละเธรดหรือสร้าง presentation/slide แยกไว้ล่วงหน้าสำหรับแต่ละเธรด วิธีนี้สอดคล้องกับคำแนะนำทั่วไปที่ไม่ควรแชร์อินสแตนซ์ presentation เดียวกันระหว่างเธรด
การทำการส่งออกเป็นรูปแบบต่าง ๆ (PDF, HTML, images) แบบขนานปลอดภัยหรือไม่ หากแต่ละเธรดมีอินสแตนซ์ Presentation ของตนเอง?
ใช่ หากใช้อินสแตนซ์แยกกันและกำหนดเส้นทางเอาต์พุตแยกต่างหาก งานเหล่านี้มักจะทำงานขนานได้อย่างถูกต้อง; ควรหลีกเลี่ยงการใช้วัตถุ presentation หรือสตรีม I/O ที่แชร์ร่วมกัน
ฉันควรทำอย่างไรกับการตั้งค่าแบบอักษรระดับโลก (โฟลเดอร์, การทดแทน) ในการทำงานหลายเธรด?
ควรกำหนดค่าการตั้งค่าแบบอักษรระดับโลกทั้งหมดก่อนเริ่มเธรดและไม่ควรเปลี่ยนแปลงในระหว่างการทำงานขนาน วิธีนี้จะขจัดการชนกันเมื่อเข้าถึงทรัพยากรแบบอักษรที่ใช้ร่วมกัน