Ποια είναι η διαφορά ανάμεσα στην αρχιτεκτονική που βασίζεται σε γεγονότα του Node.js και τον προγραμματισμό πολλαπλών νημάτων σε άλλες γλώσσες;


Απάντηση 1:

Τόσο στο πρότυπο που βασίζεται σε συμβάντα όσο και στο πρότυπο πολλαπλών νημάτων, ο κώδικας εκτελείται σε μια διαδικασία λειτουργικού συστήματος.

Όταν η διαδικασία τρέχει πολλαπλά νήματα, αυτά τα νήματα μοιράζονται τη μνήμη της διαδικασίας (χώρος διεύθυνσης) τόσο για ανάγνωση όσο και για εγγραφή.

Το JavaScript που εξάγει το Node.js είναι μονόκλωνο από το σχεδιασμό. Κάθε λειτουργία είναι εγγυημένη ότι θα ολοκληρωθεί και κανένα άλλο κώδικα JavaScript στην τρέχουσα διαδικασία δεν θα τρέξει κατά τη διάρκεια αυτής της λειτουργίας. Τα φυσικά ασύγχρονα συμβάντα (δίκτυο, είσοδος-έξοδος δίσκου, χρονοδιακόπτες, άλλο υλικό και συμβάντα λειτουργικού συστήματος) αντιμετωπίζονται από τον κινητήρα ο οποίος προσθέτει τις λειτουργίες JavaScript που έχουν καταχωρηθεί ως χειριστές (ή επανακλήσεις) για αυτά τα συμβάντα στην ουρά βρόχου συμβάντος οι λειτουργίες μπροστά από την ουρά τελειώθηκαν.

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



Απάντηση 2:

Αυτή είναι μια καλή ερώτηση: "Ποια είναι η διαφορά μεταξύ της αρχιτεκτονικής που βασίζεται σε συμβάντα του Node.js και του προγραμματισμού πολλαπλών νημάτων σε άλλες γλώσσες;".

Μπορούμε και πρέπει να το σπάσουμε λίγο.

  • Αρχιτεκτονική με βάση την εκδήλωση του κόμβου.

Η αρχιτεκτονική που βασίζεται σε συμβάντα δεν είναι αποκλειστική στον κόμβο, π.χ. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (πολλαπλές γλώσσες).

  • Προγραμματισμός πολλαπλών νημάτων σε άλλες γλώσσες.

Λάβετε υπόψη ότι η JavaScript, κατά σχεδιασμό, δεν υποστηρίζει πολλά θέματα. Αν και υποστηρίζει webworkers, οι οποίες, όσο γνωρίζω, μπορούν να λειτουργήσουν ως νήματα.

Επομένως, η εκδήλωση που οδηγείται δεν είναι μοναδική στον κόμβο και η πολλαπλή σπείρωμα μπορεί να γίνει στον Κόμβο.

Έτσι, μπορεί να υπάρχουν δύο ερωτήματα εδώ: "Ποια είναι η διαφορά μεταξύ συμβάντων με πολλαπλά στρώματα" και "Ποια είναι η διαφορά μεταξύ κόμβου και άλλων γλωσσών (πλαισίων)". Θα επικεντρωθώ στην τελευταία δεδομένου ότι αυτό φαίνεται να είναι η πρόθεση της ερώτησης.

Θα έλεγα ότι αυτό που κάνει τον κόμβο ειδικό είναι ότι ο δημιουργός το δημιούργησε για να αποφύγει την παρεμπόδιση του IO κατά την κατασκευή εφαρμογών ιστού. Η κουλτούρα της κοινότητας κόμβων είναι να τονιστούν και να βασιστούν στη δύναμη του μη αποκλεισμού IO. Δεν πρόκειται να βρείτε πάρα πολλές βιβλιοθήκες τρίτου μέρους που εκτελεί αποκλεισμό κλήσεων. Ως προγραμματιστής που χρησιμοποιεί κόμβο, είναι απίθανο να εκτελέσετε λεπτές λειτουργίες αποκλεισμού στον κώδικα σας. Ενώ σε άλλες γλώσσες, ένας αθέμιτος προγραμματιστής μπορεί να εκτελέσει κατά λάθος άκρως αναποτελεσματική δέσμευση κλήσεων όπως ανάγνωση από μια σύνδεση βάσης δεδομένων.

Εκτός από αυτό, θα πρέπει πραγματικά να διαβάσετε σχετικά με πολλαπλά μοντέλα για "συνάφεια" και να καταλάβετε τα πλεονεκτήματα και τα μειονεκτήματα του καθενός. Πόντοι μπόνους για την εκτίμηση του γιατί το πολυ-σπείρωμα ήταν αποδεκτό για τόσο μεγάλο χρονικό διάστημα.



Απάντηση 3:

οι εννοιολογικές διαφορές είναι αρκετά εύκολο να τυλίξετε το κεφάλι σας γύρω.

Στην αρχιτεκτονική που βασίζεται σε γεγονότα, το πρόγραμμά σας τρέχει σε ένα συνεχές βρόγχο με μονό σπείρωμα (μπορείτε να κάνετε μερικές πολλαπλές σπείρες στον κόμβο, αλλά μην ανησυχείτε γι 'αυτό τώρα). Όταν ένα συμβάν πυρκαγιά, μια δουλειά είναι επάνω στη στοίβα κλήσεων που πρέπει να αντιμετωπιστεί στο πρόγραμμα αναψυχής.

Η αρχιτεκτονική πολλαπλών νημάτων αποστέλλει γενικά ένα νέο νήμα όταν πρέπει να περιμένει μια ενέργεια. Έτσι, κάνετε μια κλήση σε μια βάση δεδομένων και γυρίζετε ένα νέο νήμα που θα πραγματοποιήσει όλα τα πράγματα που χρειάζεστε και να κάνετε ό, τι χρειάζεστε και να ολοκληρώσετε ή να επανέλθετε στο αρχικό νήμα.

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