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

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

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

Δεν μπορείτε να παραλληλίσετε απευθείας ένα πρότυπο `for` loop στο Python χρησιμοποιώντας μόνο το ενσωματωμένο` for` loop κατασκεύασμα. Η παγκόσμια κλειδαριά διερμηνέα της Python (GIL) εμποδίζει τα πολλαπλά νήματα από την εκτέλεση ταυτόχρονα από την Python Bytecodes σε μια ενιαία διαδικασία. Αυτό σημαίνει ότι ο αληθινός παραλληλισμός για τις εργασίες που συνδέονται με την CPU μέσα σε ένα «βρόχο» είναι αδύνατο με απλά σπειρώματα.

Ωστόσο, μπορείτε να επιτύχετε παραλληλισμό χρησιμοποιώντας πολλαπλές επεξεργασίες, η οποία παρακάμπτει το GIL δημιουργώντας πολλαπλές διαδικασίες. Δείτε πώς μπορείτε να εφαρμόσετε παράλληλη επεξεργασία στο Python χρησιμοποιώντας ένα `for` loop και τη βιβλιοθήκη` multiprocessing`:

Μέθοδος 1:Χρήση `multiprocessing.pool.map` (απλούστερη για πολλές ίδιες λειτουργίες)

Αυτή είναι η ευκολότερη προσέγγιση εάν κάθε επανάληψη του βρόχου σας εκτελεί την ίδια λειτουργία σε διαφορετικά δεδομένα. `Pool.map` διανέμεται αποτελεσματικά το έργο σε πολλαπλές διαδικασίες.

`` `Python

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

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

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

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

# ... μερικοί υπολογισμοί ...

Αποτέλεσμα επιστροφής # Επιστρέψτε το αποτέλεσμα του υπολογισμού

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

δεδομένα =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # Τα δεδομένα σας

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

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

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

`` `

Αυτός ο κώδικας δημιουργεί μια ομάδα διαδικασιών εργαζομένων (ίσο με τον αριθμό των πυρήνων CPU από προεπιλογή). Το `pool.map` εφαρμόζει ταυτόχρονα το` process_item` σε κάθε στοιχείο στα `δεδομένα 'ταυτόχρονα και επιστρέφει μια λίστα με τα αποτελέσματα με την ίδια σειρά με την είσοδο.

Μέθοδος 2:Χρήση `multiprocessing.pool.apply_async` (για πιο πολύπλοκα σενάρια ή ασύγχρονες επιχειρήσεις)

Εάν ο βρόχος σας περιλαμβάνει πιο πολύπλοκη λογική ή ασύγχρονη λειτουργία, το "apply_async` προσφέρει περισσότερο έλεγχο.

`` `Python

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

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

# ... Ο κωδικός σας ...

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

Εάν __name__ =='__main__':

δεδομένα =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

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

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

# apply_async επιστρέφει ένα αντικείμενο asyncresult

async_results =[pool.apply_async (process_item, (στοιχείο,)) για αντικείμενο σε δεδομένα]

# Λάβετε τα αποτελέσματα (μπλοκάρισμα μέχρι να ολοκληρωθούν όλες οι διαδικασίες)

για το async_result στο async_results:

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

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

`` `

Το `apply_async` σάς επιτρέπει να υποβάλετε εργασίες μεμονωμένα και να ανακτήσετε αποτελέσματα αργότερα. Αυτό είναι χρήσιμο εάν ο χρόνος επεξεργασίας για κάθε στοιχείο ποικίλλει σημαντικά.

Σημαντικές εκτιμήσεις:

* αν __name__ =='__main __':`: Αυτό είναι κρίσιμο, ειδικά στα Windows, για να αποφευχθεί η αναδρομική δημιουργία διαδικασιών.

* Κοινή χρήση δεδομένων: Αποφύγετε την κοινή χρήση μεταβλητών δεδομένων απευθείας μεταξύ των διαδικασιών. Χρησιμοποιήστε τεχνικές όπως ουρές ή σωλήνες για επικοινωνία μεταξύ των διαδικασιών για την πρόληψη των συνθηκών της φυλής.

* overhead: Η δημιουργία και η διαχείριση των διαδικασιών έχει γενικά έξοδα. Η παράλληλη επεξεργασία είναι πιο ευεργετική για υπολογιστικά εντατικά καθήκοντα όπου ο χρόνος επεξεργασίας υπερβαίνει σημαντικά τα γενικά έξοδα.

* Αριθμός διαδικασιών: Ο βέλτιστος αριθμός διαδικασιών συχνά ισούται με τον αριθμό των πυρήνων της CPU, αλλά μπορεί να χρειαστεί πειραματισμός.

Θυμηθείτε να αντικαταστήσετε το `# ... τον κωδικό σας ...` με τον πραγματικό σας υπολογισμό. Επιλέξτε τη μέθοδο που ταιριάζει καλύτερα στη δομή και την πολυπλοκότητα των λειτουργιών σας για το "Loop". Για απλές, παράλληλες λειτουργίες, το `pool.map` είναι συνήθως η προτιμώμενη και αποτελεσματικότερη προσέγγιση.

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

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