1. Πολλαπλασιασμός (για εργασίες που συνδέονται με την CPU):
Εάν οι επαναλήψεις του βρόχου σας είναι υπολογιστικά εντατικές (δεσμευμένες με CPU), η πολλαπλασιασμός είναι ο πιο αποτελεσματικός τρόπος για να παραλληλιστεί. Δημιουργεί πολλαπλές διαδικασίες, καθένα από τα οποία εκτελείται σε ξεχωριστό πυρήνα CPU. Αυτό αποφεύγει την παγκόσμια κλειδαριά διερμηνέα (GIL) που περιορίζει τον πραγματικό παραλληλισμό στην πολυεπίπεδη.
* χρησιμοποιώντας `multiprocessing.pool`: Αυτός είναι ένας βολικός τρόπος για τη διανομή εργασιών σε πολλαπλές διαδικασίες.
`` `Python
Εισαγωγή πολλαπλής επεξεργασίας
def process_item (στοιχείο):
# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο
Αποτέλεσμα =στοιχείο * 2 # Παράδειγμα λειτουργίας
αποτέλεσμα επιστροφής
Εάν __name__ =='__main__':
στοιχεία =εύρος (10)
με multiprocessing.pool (διαδικασίες =multiprocessing.cpu_count ()) ως πισίνα:
Αποτελέσματα =pool.map (process_item, αντικείμενα)
εκτύπωση (αποτελέσματα)
`` `
* Χρήση `multiprocessing.process` (για περισσότερο έλεγχο): Παρέχει λεπτότερο έλεγχο εάν πρέπει να διαχειριστείτε μεμονωμένα τις διαδικασίες. Χρήσιμο για πιο περίπλοκα σενάρια.
2. MultithReading (για εργασίες που συνδέονται με I/O):
Εάν ο βρόχος σας περιλαμβάνει πολλή αναμονή (π.χ. αιτήματα δικτύου, αρχείο I/O), το multithreading μπορεί να είναι επωφελής. Ενώ το GIL εξακολουθεί να περιορίζει τον πραγματικό παραλληλισμό για τις επιχειρήσεις που συνδέονται με την CPU μέσα σε θέματα, ο χρόνος αναμονής μπορεί να επικαλυφθεί, οδηγώντας σε βελτιωμένη απόδοση.
* Χρήση `threading`: Απλό για βασικά σενάρια. Ωστόσο, προσέξτε τους περιορισμούς του GIL.
`` `Python
Εισαγωγή σπειρώματος
def process_item (στοιχείο):
# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο (π.χ. αίτημα δικτύου)
# ... Χρονοβόρα I/O ΛΕΙΤΟΥΡΓΙΑ ...
πέρασμα
νήματα =[]
για το στοιχείο στην περιοχή (10):
Thread =Threading.Thread (Target =Process_Item, Args =(στοιχείο,))
threads.append (νήμα)
Thread.start ()
για νήμα σε νήματα:
Thread.join ()
`` `
* χρησιμοποιώντας βιβλιοθήκες όπως `concurrent.futures`: Αυτό παρέχει μια διεπαφή υψηλότερου επιπέδου τόσο για τα νήματα όσο και για τις διαδικασίες, καθιστώντας ευκολότερη τη διαχείριση τους.
`` `Python
Εισαγωγή ταυτόχρονα.
def process_item (στοιχείο):
# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο
Στοιχείο επιστροφής * 2
με ταυτόχρονα.
Αποτελέσματα =Λίστα (executor.map (process_item, εύρος (10)))
εκτύπωση (αποτελέσματα)
`` `
3. Joblib (για απλούστερη πολλαπλασιασμό):
Το `joblib` παρέχει μια φιλική προς το χρήστη διεπαφή για παραλληλισμούς βρόχους, ιδιαίτερα χρήσιμο όταν ασχολείται με numpy arrays ή scikit-learn. Διαχειρίζεται μερικές από τις πολυπλοκότητες της πολλαπλής επεξεργασίας πίσω από τις σκηνές.
`` `Python
Από την εισαγωγή JOBLIB παράλληλη, καθυστερημένη
def process_item (στοιχείο):
# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο
Στοιχείο επιστροφής * 2
Αποτελέσματα =παράλληλα (n_jobs =-1) (καθυστερημένη (process_item) (i) για i στην περιοχή (10))
εκτύπωση (αποτελέσματα)
`` `
`n_jobs =-1` χρησιμοποιεί όλους τους διαθέσιμους πυρήνες.
Επιλογή της σωστής προσέγγισης:
* CPU-Bound: Χρησιμοποιήστε `multiprocessing` (με` pool` ή `process '), ή` joblib`.
* I/O-Bound: Χρησιμοποιήστε το `multithreading` (με` concurrent.futures` συνιστάται για καθαρότερο κώδικα) ή ασύγχρονη προγραμματισμό (με `asyncio ').
* Απλή παραλληλισμός: Το `joblib` είναι μια καλή επιλογή για την ευκολία χρήσης του.
Σημαντικές εκτιμήσεις:
* overhead: Η δημιουργία και η διαχείριση των διαδικασιών ή των νημάτων διαθέτει πάνω από το κεφάλι. Η παραλληλισμός είναι επωφελής μόνο εάν η εργασία που γίνεται ανά επανάληψη είναι αρκετά σημαντική για να αντισταθμίσει αυτό το γενικό κόστος.
* Κοινή χρήση δεδομένων: Η κοινή χρήση δεδομένων μεταξύ των διαδικασιών μπορεί να είναι πιο περίπλοκη από την ανταλλαγή δεδομένων μεταξύ των νημάτων. Χρησιμοποιήστε τους κατάλληλους μηχανισμούς (π.χ. ουρές, κοινή μνήμη) εάν είναι απαραίτητο.
* Debugging: Ο παράλληλος κώδικας εντοπισμού σφαλμάτων μπορεί να είναι πιο δύσκολη. Ξεκινήστε με μικρότερα μεγέθη προβλημάτων για να διευκολύνετε την απομάκρυνση του εντοπισμού σφαλμάτων.
* εξαρτήσεις: Βεβαιωθείτε ότι οι βιβλιοθήκες που χρησιμοποιούνται στο βρόχο είναι συμβατές με την πολλαπλασιασμό (ορισμένες βιβλιοθήκες ενδέχεται να μην είναι ασφαλείς για το νήμα).
Θυμηθείτε να συγκρίνετε πάντα τον κωδικό σας για να δείτε αν η παραλληλισμός βελτιώνει πραγματικά την απόδοση στη συγκεκριμένη περίπτωση σας. Μερικές φορές, ένας καλά βελτιστοποιημένος διαδοχικός βρόχος μπορεί να είναι ταχύτερος από ένα παράλληλο παράλληλο.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα