
Ένας αξιόπιστος φίλος κωδικοποιητή μου είπε ότι η τρέχουσα εφαρμογή multi-threading Python είναι σοβαρά λάθη - αρκετά για να αποφύγετε τη χρήση συνολικά. Τι μπορεί να ειπωθεί για αυτή τη φήμη;

 
Είναι Python θέματα λάθη;
=========================



Τα θέματα Python είναι καλό για **ταυτόχρονες προγραμματισμό I / O** . Τα θέματα που αντάλλαξαν έξω από το CPU μόλις έχουν μπλοκάρει αναμονής για την είσοδο από το αρχείο, δίκτυο, κ.λπ. Αυτό επιτρέπει σε άλλα θέματα Python για να χρησιμοποιήσετε τη CPU, ενώ άλλοι περιμένουν. Αυτό θα σας επιτρέψει να γράψετε ένα multi-threaded διακομιστή web ή web crawler, για παράδειγμα.


Ωστόσο, οι Python θέματα σε συνέχειες από την [GIL](http://en.wikipedia.org/wiki/Global_Interpreter_Lock) κατά την είσοδό του πυρήνα διερμηνέα. Αυτό σημαίνει ότι αν δύο θέματα που είναι γηπέδου αριθμοί, μόνο ένας μπορεί να τρέξει σε οποιαδήποτε δεδομένη στιγμή. Σημαίνει, επίσης, ότι δεν μπορείτε να επωφεληθείτε από multi-core ή multi-επεξεργαστή αρχιτεκτονικές.


Υπάρχουν λύσεις όπως το τρέξιμο πολλαπλών διερμηνέων Python ταυτόχρονα, χρησιμοποιώντας μια βιβλιοθήκη σπείρωμα C βασίζεται. Αυτό δεν είναι για τον εξασθενημένο της καρδιάς και τα οφέλη μπορεί να μην αξίζει τον κόπο. Ας ελπίσουμε για ένα all λύση Python σε μια μελλοντική έκδοση.

 

Το έχω χρησιμοποιήσει σε διάφορες εφαρμογές και δεν είχαν ποτέ ούτε ακούσει για threading είναι οτιδήποτε άλλο εκτός από το 100% αξιόπιστη, εφ 'όσον γνωρίζετε τα όριά της. Δεν μπορείτε να αναπαράγονται 1000 τα θέματα που την ίδια στιγμή και αναμένουμε το πρόγραμμά σας για να λειτουργούν σωστά στα Windows, ωστόσο, μπορείτε εύκολα να γράψετε μια πισίνα εργαζόμενο και μόλις το ταΐσετε 1000 επιχειρήσεις, και να κρατήσει τα πάντα ωραία και υπό έλεγχο.

 

Απ 'όσο ξέρω δεν υπάρχουν πραγματικές σφάλματα, αλλά η απόδοση κατά το πέρασμα στην CPython είναι πραγματικά κακό (σε σύγκριση με τις περισσότερες άλλες εφαρμογές threading, αλλά συνήθως αρκετά καλό, αν όλα τα περισσότερα από τα θέματα που κάνουμε είναι να μπλοκ), λόγω της [GIL](http://docs.python.org/api/threads.html) (Global Interpreter Lock), έτσι ώστε πραγματικά να είναι η εφαρμογή συγκεκριμένων και όχι συγκεκριμένη γλώσσα. Jython, για παράδειγμα, δεν υποφέρουν από αυτό οφείλεται στην χρήση του μοντέλου νήμα Java.


Δείτε [αυτήν την](http://www.artima.com/weblogs/viewpost.jsp?thread=214235) ανάρτηση σχετικά με το γιατί δεν είναι πραγματικά εφικτό να αφαιρέσετε το GIL από την εφαρμογή CPython, και [αυτό](http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html) για κάποιο πρακτικό επεξεργασία και λύσεις.


Κάνετε ένα γρήγορο google για [«Python GIL»](http://www.google.com/search?q=python+gil) για περισσότερες πληροφορίες.

 

Η GIL (Global Interpreter Lock) μπορεί να είναι ένα πρόβλημα, αλλά το API είναι αρκετά ΟΚ. Δοκιμάστε την εξαιρετική `processing`μονάδα, η οποία υλοποιεί το API Threading για ξεχωριστές διαδικασίες. Είμαι χρησιμοποιώντας αυτό το δικαίωμα τώρα (αν και σε OS X, πρέπει ακόμη να κάνουμε κάποιες δοκιμές για Windows) και είμαι πραγματικά εντυπωσιασμένος. Η κατηγορία ουρά είναι πραγματικά εξοικονόμηση μπέικον μου όσον αφορά τη διαχείριση της πολυπλοκότητας!


**EDIT** : αυτό seemes το δομοστοιχείο επεξεργασίας είναι να συμπεριλαμβάνεται στην πρότυπη βιβλιοθήκη από την έκδοση 2.6 ( `import multiprocessing`). Χαρά!

 

Το πρότυπο εφαρμογής της Python (κοινώς γνωστή ως CPython όπως είναι γραμμένο σε C) χρησιμοποιεί νήματα OS, αλλά δεδομένου ότι υπάρχει η [Παγκόσμια διερμηνέα Lock](http://en.wikipedia.org/wiki/Global_Interpreter_Lock) , μόνο ένα νήμα κάθε φορά επιτρέπεται να εκτελέσει κώδικα Python. Αλλά μέσα σε αυτούς τους περιορισμούς, οι βιβλιοθήκες σπείρωμα είναι ισχυρή και ευρέως χρησιμοποιούμενα.


Αν θέλετε να είστε σε θέση να χρησιμοποιούν πολλαπλούς πυρήνες CPU, υπάρχουν μερικές επιλογές. Ένας είναι η χρήση πολλαπλών διερμηνείς python ταυτόχρονα, όπως αναφέρθηκε από τους άλλους. Μια άλλη επιλογή είναι να χρησιμοποιήσετε μια διαφορετική εφαρμογή της Python που δεν χρησιμοποιεί GIL. Οι δύο βασικές επιλογές είναι [Jython](http://en.wikipedia.org/wiki/Jython) και [IronPython](http://en.wikipedia.org/wiki/IronPython) .


Jython είναι γραμμένο σε Java και είναι πλέον αρκετά ώριμες, αν και ορισμένες ασυμβατότητες παραμένουν. Για παράδειγμα, το πλαίσιο web [Django δεν λειτουργεί τέλεια ακόμα](http://zyasoft.com/pythoneering/2008/01/django-on-jython-minding-gap.html) , αλλά γίνεται όλο και πιο κοντά όλη την ώρα. Jython είναι [μεγάλη για την ασφάλεια νήμα](http://mail.python.org/pipermail/python-list/2001-December/116555.html) , βγαίνει [καλύτερα σημεία αναφοράς](http://blogs.warwick.ac.uk/dwatkins/entry/benchmarking_parallel_python_1_2/) και έχει μια [αναιδή μήνυμα για όσους επιθυμούν την GIL](http://cgwalters.livejournal.com/17956.html) .


IronPython χρησιμοποιεί το .NET framework και είναι γραμμένο σε C #. Συμβατότητα φτάνει στο στάδιο όπου [Django μπορεί να τρέξει σε IronPython](http://www.infoq.com/news/2008/03/django-and-ironpython) (τουλάχιστον ως ένα demo) και υπάρχουν [οδηγοί να χρησιμοποιούν νήματα σε IronPython](http://www.voidspace.org.uk/ironpython/threading.shtml) .

 

Αν θέλετε να κώδικα σε Python και να πάρει μεγάλη υποστήριξη threading, ίσως να θέλετε να ελέγξετε έξω IronPython ή Jython. Δεδομένου ότι ο κώδικας python στην IronPython και Jython λειτουργούν με το .NET CLR και Java VM αντίστοιχα, απολαμβάνουν τη μεγάλη υποστήριξη σπείρωμα ενσωματωμένη σε αυτές τις βιβλιοθήκες. Εκτός από αυτό, IronPython δεν έχει την GIL, ένα ζήτημα που εμποδίζει CPython θέματα από την πλήρη αξιοποίηση των multi-core αρχιτεκτονική.

 