Πολλαπλονηματική λειτουργία στο Aspose.Slides για Node.js μέσω Java
Introduction
Ενώ η παράλληλη εργασία με παρουσιάσεις είναι δυνατή (εκτός από την ανάλυση/φόρτωση/κλωνοποίηση) και τα πάντα κυλούν καλά (της περισσότερης περιπτώσεων), υπάρχει μια μικρή πιθανότητα να λάβετε λανθασμένα αποτελέσματα όταν χρησιμοποιείτε τη βιβλιοθήκη σε πολλαπλά νήματα.
Συνιστούμε ανεπιφύλακτα να μην χρησιμοποιείτε ένα μόνο Presentation αντικείμενο σε περιβάλλον πολυνηματικό, επειδή μπορεί να οδηγήσει σε απρόβλεπτα σφάλματα ή αποτυχίες που δεν εντοπίζονται εύκολα.
Δεν είναι ασφαλές να φορτώνετε, αποθηκεύετε και/ή να κλωνοποιείτε ένα αντικείμενο της κλάσης Presentation σε πολλαπλά νήματα. Τέτοιες λειτουργίες δεν υποστηρίζονται. Αν χρειάζεται να εκτελέσετε τέτοιες εργασίες, πρέπει να παραλληλοποιήσετε τις λειτουργίες χρησιμοποιώντας πολλές μονονηματικές διεργασίες· και η κάθε μία πρέπει να χρησιμοποιεί το δικό της αντικείμενο παρουσίασης.
Convert Presentation Slides to Images in Parallel
Ας υποθέσουμε ότι θέλουμε να μετατρέψουμε όλες τις διαφάνειες από μια παρουσίαση PowerPoint σε εικόνες PNG παράλληλα. Επειδή δεν είναι ασφαλές να χρησιμοποιηθεί ένα μόνο αντικείμενο Presentation σε πολλαπλά νήματα, χωρίζουμε τις διαφάνειες της παρουσίασης σε ξεχωριστές παρουσιάσεις και μετατρέπουμε τις διαφάνειες σε εικόνες παράλληλα, χρησιμοποιώντας κάθε παρουσίαση σε ξεχωριστό νήμα. Το παρακάτω παράδειγμα κώδικα δείχνει πώς γίνεται αυτό.
const inputFilePath = "sample.pptx";
const outputFilePathTemplate = "slide_%d.png";
const imageScale = 2;
(async () => {
const presentation = new aspose.slides.Presentation(inputFilePath);
const slideCount = presentation.getSlides().size();
const slideSize = presentation.getSlideSize().getSize();
const slideWidth = slideSize.getWidth();
const slideHeight = slideSize.getHeight();
const conversionTasks = Array.from({ length: slideCount }, async (_, slideIndex) => {
// Εξαγωγή διαφάνειας i σε ξεχωριστή παρουσίαση.
const slidePresentation = new aspose.slides.Presentation();
slidePresentation.getSlideSize().setSize(slideWidth, slideHeight, aspose.slides.SlideSizeScaleType.DoNotScale);
slidePresentation.getSlides().removeAt(0);
slidePresentation.getSlides().addClone(presentation.getSlides().get_Item(slideIndex));
try {
const slide = slidePresentation.getSlides().get_Item(0);
const image = slide.getImage(imageScale, imageScale);
const imageFilePath = outputFilePathTemplate.replace("%d", slideIndex + 1);
image.save(imageFilePath, aspose.slides.ImageFormat.Png);
console.log(`Saved slide ${slideIndex + 1} to ${imageFilePath}`);
} catch (error) {
console.error(`Error processing slide ${slideIndex + 1}: ${error.message}`);
} finally {
slidePresentation.dispose();
}
});
// Περιμένετε να ολοκληρωθούν όλες οι εργασίες.
await Promise.all(conversionTasks);
presentation.dispose();
})();
FAQ
Do I need to call license setup in every thread?
Όχι. Αρκεί να το κάνετε μία φορά ανά διεργασία/περιοχή εφαρμογής πριν ξεκινήσουν τα νήματα. Εάν η ρύθμιση άδειας μπορεί να κληθεί ταυτόχρονα (π.χ., κατά τη λανθάμενη αρχικοποίηση), συγχρονίστε αυτήν την κλήση, επειδή η μέθοδος ρύθμισης άδειας δεν είναι ασφαλής ως προς τα νήματα.
Can I pass Presentation or Slide objects between threads?
Η μεταφορά «ζωντανών» αντικειμένων παρουσίασης μεταξύ νημάτων δεν συνιστάται: χρησιμοποιήστε ανεξάρτητα αντίτυπα ανά νήμα ή προδημιουργήστε ξεχωριστές παρουσιάσεις/υποδοχείς διαφανειών για κάθε νήμα. Αυτή η προσέγγιση ακολουθεί τη γενική σύσταση να μην μοιράζεστε ένα μόνο αντικείμενο παρουσίασης μεταξύ νημάτων.
Is it safe to parallelize export to different formats (PDF, HTML, images) provided each thread has its own Presentation instance?
Ναι. Με ανεξάρτητα αντίτυπα και ξεχωριστές διαδρομές εξόδου, τέτοιες εργασίες συνήθως παραλληλοποιούνται σωστά· αποφύγετε οποιαδήποτε κοινά αντικείμενα παρουσίασης και κοινά ρεύματα I/O.
What should I do with global font settings (folders, substitutions) in multithreading?
Αρχικοποιήστε όλες τις παγκόσμιες ρυθμίσεις γραμματοσειρών πριν ξεκινήσετε τα νήματα και μην τις τροποποιήσετε κατά τη διάρκεια της παράλληλης εργασίας. Αυτό εξαλείφει τους αγώνες πρόσβασης σε κοινόχρηστους πόρους γραμματοσειρών.