Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Python Προγραμματισμός

Πώς μπορεί να εφαρμοστεί παράλληλη επεξεργασία Python σε βρόχο;

Η Python προσφέρει διάφορους τρόπους για να παραλληλιστούν για βρόχους, ο καθένας με τα δικά του πλεονεκτήματα και αδυναμίες. Η καλύτερη επιλογή εξαρτάται από τη φύση του έργου μέσα στο βρόχο και το διαθέσιμο υλικό.

1. `multiprocessing`: Αυτή είναι γενικά η καλύτερη επιλογή για εργασίες που συνδέονται με την CPU (εργασίες που ξοδεύουν το μεγαλύτερο μέρος του χρόνου τους να κάνουν υπολογισμούς). Δημιουργεί πολλαπλές διαδικασίες, το καθένα με τον δικό του διερμηνέα, επιτρέποντας τον πραγματικό παραλληλισμό και παρακάμπτοντας τον παγκόσμιο κλείδωμα διερμηνέα (GIL) που περιορίζει το σπείρωμα στο Cpython.

`` `Python

Εισαγωγή πολλαπλής επεξεργασίας

def process_item (στοιχείο):

"" "Η λειτουργία που πρέπει να εκτελεστεί παράλληλα." ""

# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο πηγαίνει εδώ.

Αποτέλεσμα =Στοιχείο * 2 # Παράδειγμα:διπλασιάστε το στοιχείο

αποτέλεσμα επιστροφής

Εάν __name__ =='__main__':# Σημαντικό για τη συμβατότητα των Windows

στοιχεία =εύρος (10)

με multiprocessing.pool (διαδικασίες =multiprocessing.cpu_count ()) ως πισίνα:

Αποτελέσματα =pool.map (process_item, αντικείμενα)

εκτύπωση (αποτελέσματα)

`` `

* `multiprocessing.pool` δημιουργεί μια δεξαμενή διαδικασιών εργαζομένων.

* `pool.map` εφαρμόζει` process_item` σε κάθε στοιχείο σε `αντικείμενα 'ταυτόχρονα. Επιστρέφει μια λίστα με τα αποτελέσματα με την ίδια σειρά με την είσοδο.

* `multiprocessing.cpu_count ()` Καθορίζει τον αριθμό των πυρήνων CPU, επιτρέποντας τον βέλτιστο παραλληλισμό. Μπορείτε να καθορίσετε έναν μικρότερο αριθμό διαδικασιών εάν χρειαστεί.

2. `concurrent.futures`: Αυτό παρέχει μια διεπαφή υψηλότερου επιπέδου τόσο σε νήματα όσο και σε διαδικασίες, προσφέροντας μεγαλύτερη ευελιξία. Για εργασίες που συνδέονται με την CPU, θα θελήσετε να χρησιμοποιήσετε το `ProcessPoolExecutor '.

`` `Python

Εισαγωγή ταυτόχρονα.

def process_item (στοιχείο):

"" "Η λειτουργία που πρέπει να εκτελεστεί παράλληλα." ""

# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο πηγαίνει εδώ.

Αποτέλεσμα =Στοιχείο * 2 # Παράδειγμα:διπλασιάστε το στοιχείο

Επιστροφή στοιχείου, αποτέλεσμα #return τόσο εισόδου όσο και εξόδου για παρακολούθηση

Εάν __name__ =='__main__':

στοιχεία =εύρος (10)

με ταυτόχρονα.

Αποτελέσματα =executor.map (process_item, αντικείμενα) #ORDER διατηρούνται

Για το στοιχείο, τα αποτελέσματα:

Εκτύπωση (F "Εισαγωγή:{item}, έξοδος:{αποτέλεσμα}")

`` `

`concurrent.futures 'προσφέρει περισσότερο έλεγχο, ειδικά με` executor.submit' για μεμονωμένες εργασίες και χειρισμό εξαιρέσεων.

3. `threading` (γενικά δεν συνιστάται για εργασίες που συνδέονται με την CPU): Το Threading είναι κατάλληλο για εργασίες που συνδέονται με I/O (εργασίες που ξοδεύουν το μεγαλύτερο μέρος του χρόνου τους περιμένοντας εξωτερικούς πόρους όπως αιτήματα δικτύου ή λειτουργίες δίσκου). Λόγω του GIL, τα νήματα στο CPYTHON δεν παρέχουν πραγματικό παραλληλισμό για εργασίες που συνδέονται με την CPU.

`` `Python

Εισαγωγή σπειρώματος

def process_item (στοιχείο, αποτελέσματα):

#Ο κώδικας σας για να επεξεργαστείτε ένα μόνο στοιχείο πηγαίνει εδώ.

Αποτέλεσμα =Στοιχείο * 2 #Παράδειγμα:διπλασιάστε το στοιχείο

αποτελέσματα.

Εάν __name__ =='__main__':

στοιχεία =εύρος (10)

Αποτελέσματα =[]

νήματα =[]

για αντικείμενο σε αντικείμενα:

Thread =Threading.Thread (Target =Process_Item, Args =(στοιχείο, αποτελέσματα))

threads.append (νήμα)

Thread.start ()

για νήμα σε νήματα:

Thread.join ()

εκτύπωση (αποτελέσματα)

`` `

Αυτό το παράδειγμα χρησιμοποιεί μια κοινόχρηστη λίστα (`αποτελέσματα ') που χρειάζεται προσεκτική εξέταση για την ασφάλεια των νημάτων (χρησιμοποιώντας κλειδαριές εάν είναι απαραίτητο). Είναι πιο περίπλοκο από το `multiprocessing` ή` concurrent.futures 'για το φορτίο εργασίας που συνδέεται με την CPU και πιθανότατα δεν θα παρέχει ώθηση απόδοσης γι' αυτούς.

Επιλέγοντας τη σωστή μέθοδο:

* CPU-Bound: Χρησιμοποιήστε `multiprocessing` ή` concurrent. Το `multiprocessing` είναι γενικά απλούστερο για απλές λειτουργίες στυλ MAP-Reduce.

* I/O-Bound: Χρησιμοποιήστε `threading` ή` concurrent.futures` με `threadpoolexecutor '. `concurrent.futures 'προσφέρει καλύτερη εξαίρεση χειρισμό και έλεγχο.

* Mixed: Μια υβριδική προσέγγιση μπορεί να είναι απαραίτητη, συνδυάζοντας διαδικασίες για εξαρτήματα έντασης CPU και θέματα για εξαρτήματα που συνδέονται με I/O.

Θυμηθείτε να χειριστείτε πιθανές εξαιρέσεις στις λειτουργίες των εργαζομένων σας και να εξετάσετε τα γενικά έξοδα δημιουργίας και διαχείρισης διαδικασιών ή νημάτων. Για πολύ μικρές εργασίες, τα γενικά έξοδα μπορεί να αντισταθμίσουν τα οφέλη της παραλληλισμού. Προφίλ Ο κωδικός σας για να προσδιορίσετε εάν η παραλληλισμός παρέχει στην πραγματικότητα μια βελτίωση της απόδοσης.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα