Σε ένα multi-threaded πρόγραμμα Python ένα νήμα που δεν μπορούν να έχουν πρόσβαση με ασφάλεια Python αντικείμενα , εκτός εάν η GIL συγκρατείται από το τρέχον νήμα . Η GIL κάνει βέβαιος ότι τα δύο θέματα είναι σωστά ενημέρωση οι αναφορές αντικείμενο που ονομάζεται . Για να αρχίσετε να χρησιμοποιείτε το GIL που χρειάζεστε για να σώσει την κατάσταση νήμα σε μια μεταβλητή θέση και να απελευθερώσει την παγκόσμια ασφάλεια διερμηνέα . Σε αυτό το σημείο μπορείτε να εκτελέσετε το κλείδωμα της λειτουργίας εισόδου /εξόδου σας και να επανακτηθεί η παγκόσμια κλειδαριά διερμηνέα , όταν αυτό είναι πλήρες . Τέλος , επαναφέρετε την κατάσταση νήμα από την τοπική μεταβλητή . Μπορείτε να χρησιμοποιήσετε το ακόλουθο παράδειγμα μακροεντολής για την απλοποίηση της διαδικασίας :
Py_BEGIN_ALLOW_THREADS ... Κάνετε κάποια παρεμπόδιση της λειτουργίας I /O ... Py_END_ALLOW_THREADS εικόνων
Κλήση Python κώδικα
Η
Συχνά είναι τα θέματα που δημιουργούνται από άλλες γλώσσες προγραμματισμού όπως η C και αν χρειαστεί να καλέσετε πολλαπλές νήματα , τότε θα πρέπει να χρησιμοποιήσετε GIL . Θα πρέπει πρώτα να εγγραφείτε αυτά τα θέματα με διερμηνέα μέσω μια κρατική δομή δεδομένων νήμα και στη συνέχεια να αποκτήσει την GIL . Για να απλοποιήσει αυτή τη διαδικασία , μπορείτε να χρησιμοποιήσετε το " PyGILState_Ensure ( ) " και " PyGILState_Release ( ) " λειτουργίες . Το ακόλουθο είναι ένα παράδειγμα για το πώς να εφαρμόσετε αυτήν την ιδέα:
PyGILState_STATE gstate ? Gstate = PyGILState_Ensure ( ) ;/* Εκτέλεση ενεργειών Python εδώ . * /αποτέλεσμα = CallSomeFunction ( ) ;/* αξιολογούν αποτέλεσμα ή να χειριστεί εξαίρεση * //* Αφήστε το νήμα. Δεν Python API επιτρέπεται πέρα από αυτό το σημείο . * /PyGILState_Release ( gstate ) ?
Η Python Κλωστές
Η
Στην Python ένα νήμα είναι ένα πραγματικό νήμα σύστημα όπως και κάθε άλλη εκτέλεση του προγράμματος . Κατά την εκτέλεση ενός νήματος Python δημιουργεί μια μικρή δομή δεδομένων με την κατάσταση διερμηνέα . Μετά από αυτό ένα νέο νήμα έχει ξεκινήσει και το αποκαλεί « PyEval_CallObject . " Το τελευταίο βήμα είναι μια απλή λειτουργία C που τρέχει ό, τι ορίζεται Python . Η GIL ελέγχει προσεκτικά κάθε εκτέλεση νήμα. Το ακόλουθο είναι ένα παράδειγμα ενός νήματος Python :
timeimport εισαγωγής threadingclass CountdownThread ( threading.Thread ) : def __ init__ ( self , μετράνε) : threading.Thread.__init__ ( αυτο) self.count = countdef run ( self ) : ενώ self.count > 0 : print " Αντίστροφη μέτρηση " , self.countself.count - = 1time.sleep ( 5 ) επιστρέφουν
εικόνων GIL Προβλήματα και αντικατάσταση
Η
Python developers έχουν συζητήσει την κατάργηση της GIL , αλλά έχουν τρέξει σε μερικές προκλήσεις . Ένα πρόβλημα που συχνά αναφέρεται με GIL είναι ότι εμποδίζει multithreaded προγράμματα CPython από την πλήρη αξιοποίηση των multi-core επεξεργαστές . Οποιαδήποτε αντικατάσταση GIL πρέπει να είναι απλή και ταυτόχρονη , όταν ασχολούνται με τα θέματα . Πρέπει να είναι ταχύτερη από ό, τι GIL και πρέπει να έχουν μια καλή συμβατότητα API . Ένα παράδειγμα για τη συμβατότητα API είναι να έχουμε καλή ανίχνευση κατά την απαρίθμηση των αντικειμένων που δείχνει .
Η
εικόνων
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα