Multithreading in Aspose.Slides für Python über Java
Einführung
Obwohl parallele Arbeit mit Präsentationen möglich ist (außer beim Parsen, Laden und Klonen) und in der Regel gut funktioniert, besteht eine geringe Chance auf falsche Ergebnisse, wenn Sie die Bibliothek in mehreren Threads verwenden.
Wir empfehlen dringend, dass Sie in einer multithreaded Umgebung nicht eine einzelne Presentation Instanz verwenden, da dies zu unvorhersehbaren Fehlern oder Ausfällen führen kann, die nicht leicht zu erkennen sind.
Es ist nicht sicher, eine Presentation Instanz in mehreren Threads zu laden, zu speichern und/oder zu klonen. Derartige Vorgänge werden nicht unterstützt. Wenn Sie solche Aufgaben ausführen müssen, müssen Sie die Vorgänge mithilfe mehrerer einthreadiger Prozesse parallelisieren – und jeder dieser Prozesse sollte seine eigene Präsentationsinstanz verwenden.
Präsentationsfolien parallel in Bilder konvertieren
Angenommen, wir möchten alle Folien einer PowerPoint‑Präsentation parallel in PNG‑Bilder konvertieren. Da es unsicher ist, eine einzelne Presentation Instanz in mehreren Threads zu verwenden, teilen wir die Präsentationsfolien in separate Präsentationen auf und konvertieren die Folien parallel in Bilder, indem wir jede Präsentation in einem eigenen Thread verwenden. Das folgende Codebeispiel zeigt, wie das geht.
from concurrent.futures import ThreadPoolExecutor
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import ImageFormat, Presentation, SlideSizeScaleType
input_file_path = "sample.pptx"
output_file_path_template = "slide_{}.png"
image_scale = 2.0
def convert_slide_to_image(slide_presentation, slide_number):
try:
slide = slide_presentation.getSlides().get_Item(0)
image = slide.getImage(image_scale, image_scale)
try:
image_file_path = output_file_path_template.format(slide_number)
image.save(image_file_path, ImageFormat.Png)
finally:
image.dispose()
finally:
slide_presentation.dispose()
presentation = Presentation(input_file_path)
try:
slide_count = presentation.getSlides().size()
slide_size = presentation.getSlideSize().getSize()
slide_width = jpype.JFloat(slide_size.getWidth())
slide_height = jpype.JFloat(slide_size.getHeight())
with ThreadPoolExecutor() as executor:
conversion_tasks = []
for slide_index in range(slide_count):
# Extrahiere die Folie in eine separate Präsentation.
slide_presentation = Presentation()
slide_presentation.getSlideSize().setSize(slide_width, slide_height, SlideSizeScaleType.DoNotScale)
slide_presentation.getSlides().removeAt(0)
slide_presentation.getSlides().addClone(presentation.getSlides().get_Item(slide_index))
# Konvertiere die Folie in ein Bild in einem separaten Task.
slide_number = slide_index + 1
conversion_task = executor.submit(convert_slide_to_image, slide_presentation, slide_number)
conversion_tasks.append(conversion_task)
# Warte, bis alle Tasks abgeschlossen sind.
for conversion_task in conversion_tasks:
conversion_task.result()
finally:
presentation.dispose()
FAQ
Muss ich die Lizenzkonfiguration in jedem Thread aufrufen?
Nein. Es reicht, sie einmal pro Prozess vor dem Start der Threads auszuführen. Wenn license setup möglicherweise gleichzeitig aufgerufen wird (z. B. während der Lazy‑Initialisierung), synchronisieren Sie diesen Aufruf, da die Lizenzsetup‑Methode selbst nicht thread‑sicher ist.
Kann ich Presentation oder Slide Objekte zwischen Threads übergeben?
Das Übergeben von „lebenden“ Präsentationsobjekten zwischen Threads wird nicht empfohlen: Verwenden Sie unabhängige Instanzen pro Thread oder erstellen Sie im Voraus separate Präsentationen bzw. Foliencontainer für jeden Thread. Dieser Ansatz folgt der allgemeinen Empfehlung, eine einzelne Präsentationsinstanz nicht über Threads hinweg zu teilen.
Ist es sicher, den Export in verschiedene Formate (PDF, HTML, Bilder) zu parallelisieren, wenn jeder Thread seine eigene Presentation Instanz hat?
Ja. Mit unabhängigen Instanzen und separaten Ausgabepfaden lassen sich solche Aufgaben in der Regel korrekt parallelisieren; vermeiden Sie gemeinsam genutzte Präsentationsobjekte und geteilte I/O‑Streams.
Was soll ich mit globalen Schriftarteinstellungen (Ordner, Ersetzungen) beim Multithreading tun?
Initialisieren Sie alle globalen font settings vor dem Start der Threads und ändern Sie sie während der parallelen Arbeit nicht. Dadurch entfallen Rennbedingungen beim Zugriff auf gemeinsam genutzte Schriftressourcen.