1. `multiprocessing.pool 'για εργασίες που συνδέονται με την CPU:
Αυτό είναι κατάλληλο όταν οι επαναλήψεις βρόχου σας είναι ανεξάρτητες και υπολογιστικά εντατικές (δεσμευμένες με CPU). Είναι αποτελεσματικό για τη διανομή εργασίας σε πολλαπλούς πυρήνες CPU.
`` `Python
Εισαγωγή πολλαπλής επεξεργασίας
def my_function (i):
"" "Η λειτουργία που πρέπει να εκτελεστεί παράλληλα." ""
# Ο κωδικός σας εδώ ...
αποτέλεσμα =i * 2 # Παράδειγμα
αποτέλεσμα επιστροφής
Εάν __name__ =='__main__':
με multiprocessing.pool (διαδικασίες =multiprocessing.cpu_count ()) ως πισίνα:
Αποτελέσματα =pool.map (my_function, εύρος (10)) # Range (10) είναι το εύρος βρόχου σας "για"
εκτύπωση (αποτελέσματα) # έξοδος:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
`` `
`multiprocessing.pool.map` εφαρμόζει` my_function` σε κάθε στοιχείο σε `εύρος (10)` παράλληλα. `multiprocessing.cpu_count ()` Καθορίζει τον βέλτιστο αριθμό διαδικασιών. Ρυθμίστε αυτό με βάση το σύστημά σας και τον αριθμό των διαθέσιμων πυρήνων. Θυμηθείτε το `αν __name__ =='__main __':` Το μπλοκ είναι ζωτικής σημασίας για την κατάλληλη πολλαπλασιασμό στα Windows.
2. `concurrent.futures.processpoolexecutor` (πιο ευέλικτο):
Αυτό προσφέρει περισσότερο έλεγχο και ευελιξία από το `multiprocessing.pool ', ειδικά αν χρειάζεστε πιο λεπτόκοκκο έλεγχο ή χειρισμό σφαλμάτων.
`` `Python
Εισαγωγή ταυτόχρονα.
def my_function (i):
# Ο κωδικός σας εδώ ...
αποτέλεσμα =i * 2
επιστροφή i, αποτέλεσμα #returning τον αρχικό δείκτη και το αποτέλεσμα είναι χρήσιμο για την παρακολούθηση
Εάν __name__ =='__main__':
με ταυτόχρονα.
Αποτελέσματα =executor.map (my_function, εύρος (10))
για εγώ, αποτελέσματα σε αποτελέσματα:
Εκτύπωση (F "Είσοδος:{i}, έξοδος:{αποτέλεσμα}")
`` `
Το `executor.map` είναι παρόμοιο με το` pool.map`, αλλά επιτρέπει την εκτόξευση και χειρισμό εξαιρέσεων. Μπορείτε επίσης να χρησιμοποιήσετε το `executor.submit 'για περισσότερο ασύγχρονο έλεγχο.
3. `joblib` για απλούστερη σύνταξη (συχνά ταχύτερη):
`joblib` απλοποιεί παράλληλη επεξεργασία, ειδικά για numpy arrays. Συχνά εκτελεί καλύτερα από το `multiprocessing` για συγκεκριμένες αριθμητικές λειτουργίες.
`` `Python
Από την εισαγωγή JOBLIB παράλληλη, καθυστερημένη
def my_function (i):
# Ο κωδικός σας εδώ ...
αποτέλεσμα =i * 2
αποτέλεσμα επιστροφής
Εάν __name__ =='__main__':
Αποτελέσματα =παράλληλα (n_jobs =multiprocessing.cpu_count ()) (καθυστερημένη (my_function) (i) για i στην περιοχή (10))
εκτύπωση (αποτελέσματα)
`` `
`joblib` χειρίζεται αυτόματα τη διανομή εργασιών και τη συσσωμάτωση αποτελεσμάτων. `n_jobs` Καθορίζει τον αριθμό των παράλληλων διαδικασιών.
Σημαντικές εκτιμήσεις:
* overhead: Η παράλληλη επεξεργασία εισάγει γενικά έξοδα από τη δημιουργία και την επικοινωνία της διαδικασίας. Για πολύ μικρές εργασίες, τα γενικά έξοδα μπορεί να αντισταθμίσουν τα οφέλη.
* Κοινή χρήση δεδομένων: Αποφύγετε να μοιράζεστε μεταβλητά δεδομένα απευθείας μεταξύ των διαδικασιών. Αντ 'αυτού, περάστε αντίγραφα ή χρησιμοποιήστε μηχανισμούς επικοινωνίας μεταξύ επεξεργασίας (ουρές, σωλήνες) εάν είναι απαραίτητο.
* εξαρτήσεις: Βεβαιωθείτε ότι οι λειτουργίες σας και οι εξαρτήσεις τους είναι σωστά συσκευασμένες και διαθέσιμες σε κάθε διαδικασία εργαζομένων.
* Εργασίες I/O-Bound: Εάν ο βρόχος σας περιλαμβάνει σημαντικές λειτουργίες εισόδου/εξόδου (π.χ. αιτήματα δικτύου, αναγνώσεις αρχείων), η χρήση `multiprocessing` ενδέχεται να μην παρέχει σημαντικές ταχύτητες. Εξετάστε το `asyncio` ή το` threading` αντ 'αυτού (αν και το `threading` περιορίζεται από το Global Interpreter Lock (GIL) στο CPYTHON).
Επιλέξτε την προσέγγιση που ταιριάζει καλύτερα στις ανάγκες σας και τα χαρακτηριστικά της εργασίας σας. Για απλές περιπτώσεις, το `joblib` παρέχει συχνά την ευκολότερη και πιο αποτελεσματική λύση. Για πιο περίπλοκα σενάρια με ασύγχρονες λειτουργίες ή λεπτόκοκκο έλεγχο, το `concurrent.futures 'είναι πιο ισχυρό. Θυμηθείτε να προφύσετε πάντα τον κωδικό σας για να καθορίσετε τα πραγματικά κέρδη απόδοσης.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα