Ωστόσο, μπορείτε να επιτύχετε παραλληλισμό χρησιμοποιώντας πολλαπλές επεξεργασίες, η οποία παρακάμπτει το 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` είναι συνήθως η προτιμώμενη και αποτελεσματικότερη προσέγγιση.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα