Python Multiprocessing For-Loop

Python Multiprocessing For Loop



Η πολυεπεξεργασία είναι συγκρίσιμη με την πολυνηματική. Ωστόσο, διαφοροποιείται στο ότι μπορούμε να εκτελέσουμε μόνο ένα νήμα τη φορά λόγω του GIL που χρησιμοποιείται για τη δημιουργία νημάτων. Η πολυεπεξεργασία είναι η διαδικασία διαδοχικής εκτέλεσης λειτουργιών σε πολλούς πυρήνες CPU. Τα νήματα δεν μπορούν να λειτουργήσουν παράλληλα. Ωστόσο, η πολυεπεξεργασία μας επιτρέπει να καθιερώνουμε τις διεργασίες και να τις εκτελούμε ταυτόχρονα σε διάφορους πυρήνες CPU. Ο βρόχος, όπως το for-loop, είναι μια από τις πιο συχνά χρησιμοποιούμενες γλώσσες δέσμης ενεργειών. Επαναλάβετε την ίδια εργασία χρησιμοποιώντας διάφορα δεδομένα μέχρι να επιτευχθεί ένα κριτήριο, όπως ένας προκαθορισμένος αριθμός επαναλήψεων. Ο βρόχος ολοκληρώνει κάθε επανάληψη μία προς μία.

Παράδειγμα 1:  Χρήση του For-Loop στη μονάδα πολλαπλής επεξεργασίας Python

Σε αυτό το παράδειγμα, χρησιμοποιούμε τη διεργασία κλάσης for-loop και Python multiprocessing module. Ξεκινάμε με ένα πολύ απλό παράδειγμα, ώστε να μπορείτε γρήγορα να καταλάβετε πώς λειτουργεί ο βρόχος πολυεπεξεργασίας Python. Χρησιμοποιώντας μια διεπαφή που είναι συγκρίσιμη με τη μονάδα threading, η πολυεπεξεργασία συσκευάζει τη δημιουργία διεργασιών.







Χρησιμοποιώντας τις υποδιεργασίες αντί για νήματα, το πακέτο πολλαπλών επεξεργασιών παρέχει τόσο τοπική όσο και απομακρυσμένη ταυτόχρονη λειτουργία, αποφεύγοντας έτσι το Παγκόσμιο Κλείδωμα Διερμηνέα. Χρησιμοποιήστε έναν βρόχο for, που μπορεί να είναι αντικείμενο συμβολοσειράς ή πλειάδα, για να επαναλαμβάνετε συνεχώς μια ακολουθία. Αυτό λειτουργεί λιγότερο όπως η λέξη-κλειδί που εμφανίζεται σε άλλες γλώσσες προγραμματισμού και περισσότερο σαν μια μέθοδος επαναλήψεως που βρίσκεται σε άλλες γλώσσες προγραμματισμού. Ξεκινώντας μια νέα πολυεπεξεργασία, μπορείτε να εκτελέσετε έναν βρόχο for-loop που εκτελεί μια διαδικασία ταυτόχρονα.



Ας ξεκινήσουμε με την εφαρμογή του κώδικα για την εκτέλεση κώδικα χρησιμοποιώντας το εργαλείο 'spyder'. Πιστεύουμε ότι το 'spyder' είναι επίσης το καλύτερο για την εκτέλεση της Python. Εισάγουμε μια διαδικασία λειτουργικής μονάδας πολλαπλής επεξεργασίας που εκτελεί ο κώδικας. Η πολυεπεξεργασία στην έννοια της Python που ονομάζεται «κλάση διεργασίας» δημιουργεί μια νέα διεργασία Python, της δίνει μια μέθοδο εκτέλεσης κώδικα και δίνει στη μητρική εφαρμογή έναν τρόπο διαχείρισης της εκτέλεσης. Η κλάση Process περιέχει τις διαδικασίες start() και join(), που και οι δύο είναι κρίσιμες.



Στη συνέχεια, ορίζουμε μια συνάρτηση που ορίζεται από το χρήστη που ονομάζεται 'func'. Δεδομένου ότι είναι μια συνάρτηση που ορίζεται από το χρήστη, της δίνουμε ένα όνομα της επιλογής μας. Μέσα στο σώμα αυτής της συνάρτησης, περνάμε τη μεταβλητή “subject” ως όρισμα και την τιμή “maths”. Στη συνέχεια, καλούμε τη συνάρτηση “print()”, περνώντας τη δήλωση “The name of the common subject is” καθώς και το όρισμα “subject” που περιέχει την τιμή. Στη συνέχεια, στο επόμενο βήμα, χρησιμοποιούμε το 'if name== _main_', το οποίο σας εμποδίζει να εκτελέσετε τον κώδικα όταν το αρχείο εισάγεται ως λειτουργική μονάδα και σας επιτρέπει να το κάνετε μόνο όταν το περιεχόμενο εκτελείται ως σενάριο.





Η ενότητα συνθήκης με την οποία ξεκινάτε μπορεί να θεωρηθεί στις περισσότερες περιπτώσεις ως μια τοποθεσία για την παροχή του περιεχομένου που θα πρέπει να εκτελείται μόνο όταν το αρχείο σας εκτελείται ως σενάριο. Στη συνέχεια, χρησιμοποιούμε το όρισμα θέμα και αποθηκεύουμε κάποιες τιμές σε αυτό που είναι «επιστήμη», «Αγγλικά» και «υπολογιστής». Στη συνέχεια, στη διαδικασία δίνεται το όνομα 'διαδικασία1[]' στο επόμενο βήμα. Στη συνέχεια, χρησιμοποιούμε το 'process(target=func)' για να καλέσουμε τη συνάρτηση στη διαδικασία. Το Target χρησιμοποιείται για την κλήση της συνάρτησης και αποθηκεύουμε αυτή τη διαδικασία στη μεταβλητή 'P'.

Στη συνέχεια, χρησιμοποιούμε τη «διαδικασία1» για να καλέσουμε τη συνάρτηση «append()» η οποία προσθέτει ένα στοιχείο στο τέλος της λίστας που έχουμε στη συνάρτηση «func». Επειδή η διεργασία αποθηκεύεται στη μεταβλητή 'P', περνάμε το 'P' σε αυτή τη συνάρτηση ως όρισμα. Τέλος, χρησιμοποιούμε τη συνάρτηση “start()” με “P” για να ξεκινήσουμε τη διαδικασία. Μετά από αυτό, εκτελούμε ξανά τη μέθοδο ενώ παρέχουμε το όρισμα «θέμα» και χρησιμοποιούμε το «για» στο θέμα. Στη συνέχεια, χρησιμοποιώντας ξανά τη μέθοδο 'process1' και 'add()', ξεκινάμε τη διαδικασία. Στη συνέχεια εκτελείται η διαδικασία και επιστρέφεται η έξοδος. Στη συνέχεια, η διαδικασία καλείται να τελειώσει χρησιμοποιώντας την τεχνική 'join()'. Οι διεργασίες που δεν καλούν τη διαδικασία 'join()' δεν θα βγουν. Ένα κρίσιμο σημείο είναι ότι η παράμετρος λέξης κλειδιού 'args' πρέπει να χρησιμοποιηθεί εάν θέλετε να παρέχετε επιχειρήματα μέσω της διαδικασίας.




Τώρα, μπορείτε να δείτε στην έξοδο ότι η πρόταση εμφανίζεται πρώτα περνώντας την τιμή για το θέμα 'μαθηματικά' που περνάμε στη συνάρτηση 'func' επειδή την καλούμε πρώτα χρησιμοποιώντας τη συνάρτηση 'διαδικασία'. Στη συνέχεια, χρησιμοποιούμε την εντολή “append()” για να έχουμε τιμές που ήταν ήδη στη λίστα που προστίθεται στο τέλος. Στη συνέχεια παρουσιάστηκαν οι λέξεις «επιστήμη», «υπολογιστής» και «Αγγλικά». Αλλά, όπως μπορείτε να δείτε, οι τιμές δεν είναι στη σωστή σειρά. Αυτό συμβαίνει επειδή το κάνουν μόλις ολοκληρωθεί η διαδικασία και αναφέρουν το μήνυμά τους.

Παράδειγμα 2: Μετατροπή διαδοχικού βρόχου For-Loop σε παράλληλη πολλαπλής επεξεργασίας For-Loop

Σε αυτό το παράδειγμα, η εργασία βρόχου πολλαπλής επεξεργασίας εκτελείται διαδοχικά πριν μετατραπεί σε παράλληλη εργασία βρόχου. Μπορείτε να περιηγηθείτε σε ακολουθίες όπως μια συλλογή ή μια συμβολοσειρά με τη σειρά που εμφανίζονται χρησιμοποιώντας τους βρόχους for.

Τώρα, ας αρχίσουμε να εφαρμόζουμε τον κώδικα. Αρχικά, εισάγουμε το 'sleep' από τη μονάδα χρόνου. Χρησιμοποιώντας τη διαδικασία 'sleep()' στη μονάδα χρόνου, μπορείτε να αναστείλετε την εκτέλεση του νήματος κλήσης για όσο χρονικό διάστημα θέλετε. Στη συνέχεια, χρησιμοποιούμε το 'random' από το random module, ορίζουμε μια συνάρτηση με το όνομα 'func' και περνάμε τη λέξη-κλειδί 'argu'. Στη συνέχεια, δημιουργούμε μια τυχαία τιμή χρησιμοποιώντας το 'val' και την ορίζουμε σε 'τυχαία'. Στη συνέχεια, μπλοκάρουμε για λίγο χρησιμοποιώντας τη μέθοδο “sleep()” και περνάμε το “val” ως παράμετρο. Στη συνέχεια, για να στείλουμε ένα μήνυμα, εκτελούμε τη μέθοδο “print()”, περνώντας τις λέξεις “ready” και τη λέξη-κλειδί “arg” ως παράμετρό της, καθώς και “created” και περνάμε την τιμή χρησιμοποιώντας το “val”.

Τέλος, χρησιμοποιούμε το 'flush' και το ρυθμίζουμε σε 'True'. Ο χρήστης μπορεί να αποφασίσει εάν θα αποθηκεύσει ή όχι την έξοδο χρησιμοποιώντας την επιλογή flush στη λειτουργία εκτύπωσης της Python. Η προεπιλεγμένη τιμή False αυτής της παραμέτρου υποδεικνύει ότι η έξοδος δεν θα αποθηκευτεί στην προσωρινή μνήμη. Η έξοδος εμφανίζεται ως μια σειρά γραμμών που διαδέχονται η μία την άλλη εάν την ορίσετε σε true. Στη συνέχεια, χρησιμοποιούμε το 'if name== main' για να ασφαλίσουμε τα σημεία εισόδου. Στη συνέχεια, εκτελούμε την εργασία διαδοχικά. Εδώ, ορίζουμε το εύρος σε '10' που σημαίνει ότι ο βρόχος τελειώνει μετά από 10 επαναλήψεις. Στη συνέχεια, καλούμε τη συνάρτηση “print()”, της μεταβιβάζουμε την πρόταση εισαγωγής “ready” και χρησιμοποιούμε την επιλογή “flush=True”.


Μπορείτε τώρα να δείτε ότι όταν εκτελούμε τον κώδικα, ο βρόχος κάνει τη λειτουργία να εκτελεστεί '10' φορές. Επαναλαμβάνεται 10 φορές, ξεκινώντας από τον δείκτη μηδέν και τελειώνοντας στον δείκτη εννέα. Κάθε μήνυμα περιέχει έναν αριθμό εργασίας που είναι ένας αριθμός συνάρτησης που μεταβιβάζουμε ως 'arg' και έναν αριθμό δημιουργίας.


Αυτός ο διαδοχικός βρόχος μετατρέπεται τώρα σε έναν παράλληλο βρόχο πολλαπλής επεξεργασίας. Χρησιμοποιούμε τον ίδιο κώδικα, αλλά πηγαίνουμε σε μερικές επιπλέον βιβλιοθήκες και συναρτήσεις για πολλαπλή επεξεργασία. Επομένως, πρέπει να εισάγουμε τη διαδικασία από την πολυεπεξεργασία, όπως ακριβώς εξηγήσαμε νωρίτερα. Στη συνέχεια, δημιουργούμε μια συνάρτηση που ονομάζεται 'func' και περνάμε τη λέξη-κλειδί 'arg' πριν χρησιμοποιήσουμε 'val=random' για να πάρουμε έναν τυχαίο αριθμό.

Στη συνέχεια, αφού καλέσουμε τη μέθοδο «print()» για να εμφανίσουμε ένα μήνυμα και δώσουμε την παράμετρο «val» για να καθυστερήσει μια μικρή περίοδο, χρησιμοποιούμε τη συνάρτηση «if name= main» για να ασφαλίσουμε τα σημεία εισόδου. Στη συνέχεια, δημιουργούμε μια διεργασία και καλούμε τη συνάρτηση στη διαδικασία χρησιμοποιώντας το 'process' και περνάμε το 'target=func'. Στη συνέχεια, περνάμε το «func», «arg», περνάμε την τιμή «m» και περνάμε το εύρος «10» που σημαίνει ότι ο βρόχος τερματίζει τη συνάρτηση μετά από «10» επαναλήψεις. Στη συνέχεια, ξεκινάμε τη διαδικασία χρησιμοποιώντας τη μέθοδο 'start()' με 'process'. Στη συνέχεια, καλούμε τη μέθοδο 'join()' για να περιμένουμε την εκτέλεση της διαδικασίας και να ολοκληρώσουμε όλη τη διαδικασία μετά.


Επομένως, όταν εκτελούμε τον κώδικα, οι συναρτήσεις καλούν την κύρια διεργασία και ξεκινούν την εκτέλεσή τους. Γίνονται, ωστόσο, μέχρι να ολοκληρωθούν όλες οι εργασίες. Μπορούμε να το δούμε αυτό επειδή κάθε εργασία εκτελείται ταυτόχρονα. Αναφέρει το μήνυμά του μόλις τελειώσει. Αυτό σημαίνει ότι παρόλο που τα μηνύματα είναι εκτός σειράς, ο βρόχος τελειώνει αφού ολοκληρωθούν και οι «10» επαναλήψεις.

συμπέρασμα

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