Το Node js αντιμετωπίζει ένα αρχείο ως ροή. NodeJS. Τι είναι τα streams και τα buffers; Αλλαγή και προσαρμογή δεδομένων

Τρόπος χρήσης

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

Στη συνέχεια στο τμήμα στη σελίδα στην οποία σκοπεύετε να χρησιμοποιήσετε το φιλτράρισμα, πρέπει να εισαγάγετε τον κωδικό σύνδεσης της προσθήκης:

$(document).ready(function() ( $("element_for_filtering").liveFilter("option"); ));

Πρέπει να αντικαταστήσετε το "/path_to_plugin/" με τη διαδρομή όπου βρίσκεται το πρόσθετο liveFilter, το οποίο αποσυσκευάσατε νωρίτερα. Πρέπει επίσης να αντικαταστήσετε το "filter_element" με έναν επιλογέα CSS που ταιριάζει με το επιθυμητό στοιχείο.

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

Για παράδειγμα:

$(ul#filter_me).liveFilter("slide");

Ο παραπάνω κώδικας λέει στην προσθήκη LiveFilter να φιλτράρει την αδιάτακτη λίστα με αναγνωριστικό " filter_me"και χρησιμοποιήστε κινούμενα σχέδια" ολίσθηση”.

Το πρόσθετο μπορεί να χρησιμοποιηθεί για μη ταξινομημένες και ταξινομημένες λίστες και πίνακες. Πρέπει να καθορίσετε τον απαιτούμενο επιλογέα όταν καλείτε την προσθήκη.

Σπουδαίος! Για να λειτουργήσει η προσθήκη, πρέπει να προσθέσετε ένα πεδίο εισαγωγής κειμένου με την τάξη στη σελίδα "φίλτρο". Αυτό το πεδίο θα χρησιμοποιηθεί για την εισαγωγή κειμένου φιλτραρίσματος:

Παράδειγμα σελίδας που χρησιμοποιεί φίλτρο:

Παράδειγμα χρήσης της προσθήκης LiveFilter $(document).ready(function() ( $(ul#filter_me").liveFilter("slide"); ));

  • Σημείο Νο. 1.
  • Σημείο Νο 2.
  • Σημείο Νο. 3.
  • Σημείο Νο. 4.
  • Σημείο Νο. 5.
  • Σημείο Νο. 6.
  • Σημείο Νο. 7.
  • Σημείο Νο. 8.
  • Σημείο Νο. 9.
  • Σημείο Νο. 10.

Κωδικός προσθήκης

(function($)( $.fn.liveFilter = συνάρτηση (aType) ( // Προσδιορίστε τι θα φιλτραριστεί. var filterTarget = $(this); var child; if ($(this).is("ul")) ( παιδί = "li"; ) else if ($(this).is("ol")) ( child = "li"; ) other if ($(this).is("table")) ( child = " tbody tr"; ) // Ορισμός μεταβλητών var hide; var show; var filter; // Συμβάν για το στοιχείο εισόδου $("input.filter").keyup(function() ( // Λήψη του φίλτρου τιμής φίλτρου = $( this) .val() ; show = $(filterTarget).find(child + ":Contains("" + filter + "")") // Κινούμενη κίνηση των στοιχείων που πρέπει να κρυφτούν και να εμφανιστούν εάν (aType == "βασικό") (απόκρυψη. hide() ; show.show() else if (aType == "slide") (hide.slideUp(500); show.slideDown(500); else if (aType == "fade") (απόκρυψη. fadeOut(400) ); (a ).text().toLowerCase().indexOf(m.toLowerCase())>=0; ) ) ))(jQuery);



nodejs stream (3)

Νομίζω ότι σκέφτεσαι υπερβολικά πώς λειτουργούν όλα, και αυτό μου αρέσει.

Για ποιες ροές είναι καλές

Τα νήματα είναι καλά για δύο πράγματα:

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

    συνδέουν επίσης καλά προγράμματα μεταξύ τους (συναρτήσεις ανάγνωσης). Καθώς και σε γραμμή εντολών, μπορείτε να συνδυάσετε διαφορετικά προγράμματαγια να πετύχετε το επιθυμητό αποτέλεσμα. Παράδειγμα: αρχείο γάτας | grep word αρχείο cat | λέξη grep.

Πώς λειτουργούν κάτω από την κουκούλα...

Οι περισσότερες από αυτές τις λειτουργίες που χρειάζονται χρόνο για να επεξεργαστούν και μπορεί να σας δώσουν μερικά αποτελέσματα καθώς τα λαμβάνετε δεν γίνονται από το Node.js, γίνονται από το V8 JS Engine και μεταβιβάζουν αυτά τα αποτελέσματα μόνο στην JS για να εργαστείτε.

Για να κατανοήσετε το παράδειγμα http, πρέπει να κατανοήσετε πώς λειτουργεί το http

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

Οι ερωτήσεις και οι απαντήσεις σας.

Πρώτον, τα νήματα Node.js εκτελούνται μόνο σε ένα πρόγραμμα Node.js. Τα νήματα Node.js δεν μπορούν να αλληλεπιδράσουν με ένα νήμα σε άλλο διακομιστή ή ακόμη και μέσα σε ένα πρόγραμμα.

Αυτό σημαίνει ότι στο παρακάτω παράδειγμα, το Node.js δεν μπορεί να μιλήσει στον διακομιστή ιστού. Δεν μπορεί να του πει να σταματήσει ή να ξαναρχίσει.

Διακομιστής δικτύου Node.js

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

Τι συμβαίνει στην πραγματικότητα όταν κάνετε .pause ή .continue στο Node.js;

Αρχίζει να αποθηκεύει προσωρινά το αίτημα μέχρι να είστε έτοιμοι να το χρησιμοποιήσετε ξανά. Αλλά η λήψη δεν σταμάτησε ποτέ.

Βρόχος συμβάντος

Έχω μια ολόκληρη απάντηση για να εξηγήσω πώς λειτουργεί το Event Loop, αλλά νομίζω ότι είστε καλύτερα.

Το πρώτο πράγμα που πρέπει να σημειωθεί είναι ότι οι ροές stream.js δεν περιορίζονται σε αιτήματα HTTP. HTTP Requests/Network Resources είναι μόνο ένα παράδειγμα ροής στο node.js.

Τα νήματα είναι χρήσιμα για οτιδήποτε μπορεί να υποστεί επεξεργασία σε μικρά κομμάτια. Σας επιτρέπουν να επεξεργάζεστε δυνητικά τεράστιους πόρους σε μικρά κομμάτια που ταιριάζουν πιο εύκολα στο δικό σας ΕΜΒΟΛΟ.

Ας υποθέσουμε ότι έχετε ένα αρχείο (μέγεθος πολλών gigabyte) και θέλετε να μετατρέψετε τα πάντα πεζάγια να γράψετε κεφαλαία και να γράψετε το αποτέλεσμα σε άλλο αρχείο. Μια αφελής προσέγγιση θα διάβαζε ολόκληρο το αρχείο χρησιμοποιώντας το fs.readFile (η διαχείριση σφαλμάτων παραλείφθηκε για συντομία):

fs. readFile ("my_huge_file" , συνάρτηση (er , data ) ( var convertedData = data . toString (). toUpperCase (); fs . writeFile ( "my_converted_file" , convertedData ); ));

Δυστυχώς, αυτή η προσέγγιση θα υπερφορτώσει εύκολα τη μνήμη RAM, καθώς ολόκληρο το αρχείο πρέπει να αποθηκευτεί για να μπορέσει να γίνει η επεξεργασία του. Χάνεις επίσης πολύτιμο χρόνο περιμένοντας να διαβαστεί το αρχείο. Δεν έχει νόημα η επεξεργασία του αρχείου σε μικρά κομμάτια; Μπορείτε να ξεκινήσετε την επεξεργασία μόλις λάβετε τα πρώτα byte, περιμένοντας μέχρι HDDθα παρέχει τα υπόλοιπα δεδομένα:

var readStream = fs . createReadStream("my_huge_file"); var writeStream = fs . createWriteStream("my_converted_file"); readStream. on ("δεδομένα" , συνάρτηση (κομμάτι) (var convertedChunk = τεμάχιο. toString (). toUpperCase (); writeStream . write (convertedChunk); )); readStream. on ("end" , function () (writeStream . end (); ));

Αυτή η προσέγγιση είναι πολύ καλύτερη:

  • Θα έχετε να κάνετε μόνο με μικρά κομμάτια δεδομένων που θα χωρέσουν εύκολα στη μνήμη RAM σας.
  • Ξεκινάτε την επεξεργασία μόλις φτάσει το πρώτο byte και δεν χάνετε χρόνο κάνοντας τίποτα άλλο από το να περιμένετε.
  • Μόλις ανοίξει η ροή, το node.js θα ανοίξει το αρχείο και θα ξεκινήσει την ανάγνωση από αυτό. Μόλις το λειτουργικό σύστημα μεταφέρει μερικά byte στη ροή που διαβάζει το αρχείο, θα μεταφερθεί μαζί με την εφαρμογή σας.

    Επιστροφή στις ροές HTTP:

  • Το πρώτο πρόβλημα είναι επίσης σχετικό εδώ. Ο εισβολέας μπορεί να σας στέλνει μεγάλες ποσότητες δεδομένων για να υπερφορτώσει τη μνήμη RAM και το DoS (DoS) της υπηρεσίας σας.
  • Ωστόσο, το δεύτερο πρόβλημα είναι ακόμη πιο σημαντικό σε αυτήν την περίπτωση: το δίκτυο μπορεί να είναι πολύ αργό (σκεφτείτε τα smartphone) και μπορεί να χρειαστεί πολύς χρόνος για να σταλούν όλα από τον πελάτη. Χρησιμοποιώντας μια ροή, μπορείτε να ξεκινήσετε την επεξεργασία του αιτήματος και να μειώσετε τον χρόνο απόκρισης.
  • Κατά την παύση μιας ροής HTTP: Αυτό δεν γίνεται σε επίπεδο HTTP, αλλά κάτω. Εάν διακόψετε τη ροή, το node.js απλώς θα σταματήσει την ανάγνωση από την υποκείμενη υποδοχή TCP. Το τι θα συμβεί στη συνέχεια εξαρτάται από τον πυρήνα. Μπορεί ακόμα να αποθηκεύσει τα εισερχόμενα δεδομένα, ώστε να είναι έτοιμο για εσάς μόλις ολοκληρώσετε την τρέχουσα εργασία σας. . Οι εφαρμογές δεν χρειάζεται να ασχοληθούν με αυτό. Δεν είναι δική τους δουλειά. Στην πραγματικότητα, η εφαρμογή του αποστολέα μάλλον δεν αντιλαμβάνεται καν ότι δεν διαβάζετε πλέον ενεργά!

    Οπότε ουσιαστικά παρέχει δεδομένα μόλις είναι διαθέσιμα, αλλά χωρίς να συντρίψει τους πόρους. Η κύρια δύσκολη δουλειά γίνεται είτε λειτουργικό σύστημα(π.χ. net , fs , http), ή από τον συγγραφέα της ροής που χρησιμοποιείται (π.χ. zlib που είναι μια ροή Transform και συνήθως συνδέεται με fs ή net).

    Το παρακάτω διάγραμμα φαίνεται να είναι μια αρκετά ακριβής επισκόπηση/διάγραμμα 10.000 ποδιών για την κατηγορία κομβικής ροής.

    Τελευταία ενημέρωση: 17/11/2018

    Η ροή αντιπροσωπεύει μια ροή δεδομένων. Υπάρχουν ρέματα διάφοροι τύποι, μεταξύ των οποίων διακρίνουμε τα νήματα για ανάγνωση και τα νήματα για τη γραφή.

    Κατά τη δημιουργία ενός διακομιστή στο πρώτο κεφάλαιο, συναντήσαμε ήδη νήματα:

    Const http = απαιτείται ("http"); http.createServer(function(request, response)( )).listen(3000);

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

    Χρησιμοποιώντας ροές ανάγνωσης και εγγραφής, μπορούμε να διαβάσουμε και να γράψουμε πληροφορίες σε ένα αρχείο. Για παράδειγμα:

    Const fs = require("fs"); ας writeableStream = fs.createWriteStream("hello.txt"); writeableStream.write("Hello world!"); writeableStream.write("Συνέχεια εγγραφής \n"); writeableStream.end("Τερματισμός εγγραφής"); ας readableStream = fs.createReadStream("hello.txt", "utf8"); readableStream.on("data", function(chunk)( console.log(chunk); ));

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

    Τα δεδομένα γράφονται χρησιμοποιώντας τη μέθοδο write(), στην οποία μεταφέρονται τα δεδομένα. Για να τερματιστεί η εγγραφή, καλείται η μέθοδος end().

    Μετά από αυτό, εμφανίζεται ένα αρχείο hello.txt στο φάκελο του έργου, το οποίο μπορεί να ανοίξει σε οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου.

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

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

    ReadableStream.on("data", function(chunk)( console.log(chunk); ));

    Ας τρέξουμε το αρχείο για εκτέλεση:

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



    Η έκδοση 10.5.0 της πλατφόρμας Node.js κυκλοφόρησε πρόσφατα. Ένα από τα κύρια χαρακτηριστικά του ήταν η υποστήριξη για εργασία με νήματα που προστέθηκε για πρώτη φορά στο Node.js, η οποία είναι ακόμα πειραματική. Το γεγονός αυτό είναι ιδιαίτερα ενδιαφέρον υπό το πρίσμα του γεγονότος ότι αυτή η ευκαιρίατώρα η πλατφόρμα της οποίας οι οπαδοί ήταν πάντα περήφανοι για το γεγονός ότι δεν χρειάζεται νήματα, χάρη στο φανταστικό υποσύστημα ασύγχρονης I/O. Ωστόσο, η υποστήριξη για νήματα εμφανίστηκε επιτέλους στο Node.js. Γιατί συνέβη; Ποιος μπορεί να τα χρησιμοποιήσει και γιατί;

    Με λίγα λόγια, αυτό είναι απαραίτητο για να μπορέσει η πλατφόρμα Node.js να φτάσει σε νέα ύψη σε εκείνες τις περιοχές στις οποίες προηγουμένως έδειξε λιγότερα από αστρικά αποτελέσματα. Μιλάμε για την εκτέλεση υπολογισμών που χρησιμοποιούν εντατικά πόρους επεξεργαστή. Αυτός είναι βασικά ο λόγος για τον οποίο το Node.js δεν διαφέρει ισχυρές θέσειςσε τομείς όπως η τεχνητή νοημοσύνη, η μηχανική μάθηση, η επεξεργασία μεγάλου όγκου δεδομένων. Καταβλήθηκε μεγάλη προσπάθεια για να επιτραπεί στο Node.js να έχει καλή απόδοση στην επίλυση τέτοιων προβλημάτων, αλλά εδώ αυτή η πλατφόρμα εξακολουθεί να φαίνεται πολύ πιο μέτρια από ό,τι, για παράδειγμα, στην ανάπτυξη μικροϋπηρεσιών.

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

    Σχετικά με τη λειτουργική μονάδα worker_threads και τη σημαία --experimental-worker Η υποστήριξη πολλαπλών νημάτων στο Node.js υλοποιείται με τη μορφή της λειτουργικής μονάδας worker_threads. Επομένως, προκειμένου να επωφεληθούν νέα ευκαιρία, αυτή η ενότητα πρέπει να συμπεριληφθεί χρησιμοποιώντας την εντολή ζήτησης.

    Λάβετε υπόψη ότι μπορείτε να εργαστείτε μόνο με worker_threads χρησιμοποιώντας τη σημαία -- experimental-worker κατά την εκτέλεση του σεναρίου, διαφορετικά το σύστημα δεν θα βρει αυτήν την ενότητα.

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

    Σχετικά με τις εργασίες που μπορούν να επιλυθούν χρησιμοποιώντας εργαζόμενους στο Node.js Τα νήματα Εργαζομένων έχουν σχεδιαστεί, όπως ήδη αναφέρθηκε, για την επίλυση προβλημάτων που χρησιμοποιούν εντατικά τις δυνατότητες του επεξεργαστή. Θα πρέπει να σημειωθεί ότι η χρήση τους για την επίλυση προβλημάτων εισόδου/εξόδου είναι σπατάλη πόρων, καθώς, σύμφωνα με την επίσημη τεκμηρίωση, οι εσωτερικοί μηχανισμοί του Node.js που στοχεύουν στην οργάνωση ασύγχρονων I/O είναι από μόνοι τους πολύ πιο αποτελεσματικοί από τη χρήση τους. για την επίλυση του ίδιου προβλήματος των νημάτων εργασίας. Ως εκ τούτου, θα αποφασίσουμε αμέσως ότι δεν θα ασχοληθούμε με την εισαγωγή και την έξοδο δεδομένων χρησιμοποιώντας εργαζόμενους.

    Ας ξεκινήσουμε με ένα απλό παράδειγμα που δείχνει πώς να δημιουργείτε και να χρησιμοποιείτε εργάτες.

    Παράδειγμα #1 const ( Worker, isMainThread, workerData ) = require("worker_threads"); έστω currentVal = 0; let intervals = συνάρτηση counter(id, i)( console.log("[", id, "]", i) return i; ) if(isMainThread) ( console.log("αυτό είναι το κύριο νήμα") for( έστω i = 0;< 2; i++) { let w = new Worker(__filename, {workerData: i}); } setInterval((a) =>currentVal = counter(a,currentVal + 1), διαστήματα, "MainThread"); ) else ( console.log("αυτό δεν είναι") setInterval((a) => currentVal = counter(a,currentVal + 1), intervals, workerData); )
    Η έξοδος αυτού του κώδικα θα μοιάζει με μια σειρά γραμμών που εμφανίζουν μετρητές που αυξάνονται σε αξία με σε διαφορετικές ταχύτητες.


    Αποτελέσματα του πρώτου παραδείγματος

    Ας καταλάβουμε τι συμβαίνει εδώ:

  • Οι οδηγίες μέσα στη δήλωση if δημιουργούν 2 νήματα, ο κώδικας των οποίων, χάρη στην παράμετρο __filename, λαμβάνεται από το ίδιο σενάριο που μεταβιβάστηκε στο Node.js κατά την εκτέλεση του παραδείγματος. Τώρα οι εργαζόμενοι χρειάζονται την πλήρη διαδρομή προς το αρχείο κώδικα, δεν υποστηρίζουν σχετικές διαδρομές, γι' αυτό χρησιμοποιείται αυτή η τιμή εδώ.
  • Τα δεδομένα αποστέλλονται σε αυτούς τους δύο εργαζόμενους ως καθολική παράμετρος, με τη μορφή του χαρακτηριστικού workerData, το οποίο χρησιμοποιείται στο δεύτερο όρισμα. Μετά από αυτό, πρόσβαση σε δεδομένη αξίαμπορεί να ληφθεί μέσω μιας σταθεράς με το ίδιο όνομα (σημειώστε πώς δημιουργείται η αντίστοιχη σταθερά στην πρώτη γραμμή του αρχείου και πώς χρησιμοποιείται στην τελευταία γραμμή).
  • Αυτό δείχνει ένα πολύ απλό παράδειγμα χρήσης της ενότητας worker_threads, τίποτα ενδιαφέρον δεν συμβαίνει ακόμα εδώ. Επομένως, ας εξετάσουμε ένα άλλο παράδειγμα Νο. 2 Ας εξετάσουμε ένα παράδειγμα στο οποίο, πρώτον, θα κάνουμε μερικούς «βαρείς» υπολογισμούς και, δεύτερον, θα κάνουμε κάτι ασύγχρονο στο κύριο νήμα.

    Const ( Worker, isMainThread, parentPort, workerData ) = require("worker_threads"); const request = απαιτώ("αίτημα"); if(isMainThread) ( console.log("Αυτό είναι το κύριο νήμα") ας w = new Worker(__filename, (workerData: null)); w.on("message", (msg) => ( //Μήνυμα από εργαζόμενος! error w.on("exit", (code) => (if(code != 0) console.error(new Error(`Worker stop with exit code)$(code)))); "http://www.google.com", (er, resp) => ( if(err) ( return console.error(err); ) console.log("Συνολικά ληφθέντα byte: ", αντιστοίχως body.length ); = Date.now() αφήστε bigList = Array(1000000).fill().map((_) => random(1,10000)) sorter.sort(bigList) parentPort.postMessage(( val: sorter); firstValue, timeDiff: Date.now() - start));
    Για να εκτελέσετε αυτό το παράδειγμα μόνοι σας, σημειώστε ότι αυτός ο κώδικας χρειάζεται την ενότητα αιτήματος (μπορεί να εγκατασταθεί χρησιμοποιώντας npm, για παράδειγμα, χρησιμοποιώντας τις εντολές npm init --yes και npm στον κενό κατάλογο με το αρχείο που περιέχει την παραπάνω εγκατάσταση κώδικα request --save), και το γεγονός ότι χρησιμοποιεί μια βοηθητική ενότητα, συνδεδεμένη με την εντολή const sorter = require("./list-sorter"); . Το αρχείο αυτής της ενότητας (list-sorter.js) θα πρέπει να βρίσκεται στην ίδια θέση με το αρχείο που περιγράφεται παραπάνω, ο κώδικάς του μοιάζει με αυτό:

    Module.exports = ( firstValue: null, sort: function(list) ( let sorted = list.sort(); this.firstValue = sorted ) )
    Αυτή τη φορά λύνουμε δύο προβλήματα παράλληλα. Πρώτον, φορτώνουμε την αρχική σελίδα του google.com και, δεύτερον, ταξινομούμε έναν τυχαία δημιουργημένο πίνακα εκατομμυρίων αριθμών. Αυτό μπορεί να διαρκέσει μερικά δευτερόλεπτα, γεγονός που μας δίνει μια εξαιρετική ευκαιρία να δούμε τους νέους μηχανισμούς Node.js σε δράση. Επιπλέον, εδώ μετράμε τον χρόνο που χρειάζεται για να ταξινομήσει τους αριθμούς το νήμα εργάτη και, στη συνέχεια, στέλνουμε το αποτέλεσμα της μέτρησης (μαζί με το πρώτο στοιχείο του ταξινομημένου πίνακα) στο κύριο νήμα, το οποίο εκτυπώνει τα αποτελέσματα στην κονσόλα.


    Το αποτέλεσμα του δεύτερου παραδείγματος

    Σε αυτό το παράδειγμα, το πιο σημαντικό πράγμα είναι να δείξουμε τον μηχανισμό ανταλλαγής δεδομένων μεταξύ νημάτων.
    Οι εργαζόμενοι μπορούν να λαμβάνουν μηνύματα από το κύριο νήμα χάρη στη μέθοδο ενεργοποίησης. Στον κώδικα μπορείτε να βρείτε τα γεγονότα που ακούμε. Το συμβάν μηνύματος καλείται κάθε φορά που δημοσιεύουμε ένα μήνυμα από ένα νήμα χρησιμοποιώντας τη μέθοδο parentPort.postMessage. Επιπλέον, η ίδια μέθοδος μπορεί να χρησιμοποιηθεί για την αποστολή μηνυμάτων σε ένα νήμα, για πρόσβαση στην παρουσία του εργαζόμενου και για λήψη τους χρησιμοποιώντας το αντικείμενο parentPort.

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

    Παράδειγμα αρ. 3 Ως τελευταίο παράδειγμα, προτείνουμε να εξετάσουμε την υλοποίηση της ίδιας λειτουργικότητας όπως στο προηγούμενο παράδειγμα, αλλά αυτή τη φορά θα βελτιώσουμε τη δομή του κώδικα, θα τον κάνουμε πιο καθαρό και θα τον φέρουμε σε μια μορφή που αυξάνει το ευκολία υποστήριξης ενός έργου λογισμικού.

    Εδώ είναι ο κώδικας για το κύριο πρόγραμμα.

    Const ( Worker, isMainThread, parentPort, workerData ) = require("worker_threads"); const request = απαιτώ("αίτημα"); συνάρτηση startWorker(διαδρομή, cb) ( έστω w = new Worker(path, (workerData: null)); w.on("message", (msg) => ( cb(null, msg) )) w.on(" error", cb); w.on("exit", (code) => ( if(code != 0) console.error(new Error(`Worker stop with exit code $(code)`)) )); return w; console.log("[]") console.log("Η πρώτη τιμή είναι: ", result.val console.log("Took: ", (result.timeDiff / 1000), " seconds" )) const start =); Date.now(); request.get("http://www.google.com", (err, resp) => ( if(err) ( return console.error(err); ) console.log("Συνολικά ληφθέντα byte: ", resp .body.length); //myWorker.postMessage((ολοκληρώθηκε: true, timeDiff: Date.now() - start)) //έτσι μπορείτε να στείλετε μηνύματα στον εργαζόμενο
    Και εδώ είναι ο κώδικας που περιγράφει τη συμπεριφορά του νήματος εργαζόμενου (στο παραπάνω πρόγραμμα, η διαδρομή προς το αρχείο με αυτόν τον κώδικα σχηματίζεται χρησιμοποιώντας την κατασκευή __dirname + "/workerCode.js"):

    Const ( parentPort ) = require ("worker_threads"); συνάρτηση random(min, max) ( return Math.random() * (max - min) + min ) const sorter = require("./list-sorter"); const start = Date.now() αφήστε bigList = Array(1000000).fill().map((_) => random(1,10000)) /** //δείτε πώς μπορείτε να λάβετε το μήνυμα από το κύριο νήμα: parentPort.on ("message", (msg) => ( console.log("Το κύριο νήμα ολοκληρώθηκε στις: ", (msg.timeDiff / 1000), " seconds..."); )) */ sorter.sort( bigList); parentPort.postMessage(( val: sorter.firstValue, timeDiff: Date.now() - start));
    Ακολουθούν τα χαρακτηριστικά αυτού του παραδείγματος:

  • Τώρα ο κώδικας για το κύριο νήμα και το νήμα εργάτη βρίσκεται σε διαφορετικά αρχεία. Αυτό διευκολύνει τη συντήρηση και την επέκταση του έργου.
  • Η συνάρτηση startWorker επιστρέφει μια νέα παρουσία εργαζόμενου, η οποία επιτρέπει την αποστολή μηνυμάτων σε αυτόν τον εργαζόμενο από το κύριο νήμα, εάν είναι απαραίτητο.
  • Δεν χρειάζεται να ελέγξετε αν ο κώδικας εκτελείται στο κύριο νήμα (έχουμε αφαιρέσει τη δήλωση if με τον αντίστοιχο έλεγχο).
  • Ο εργαζόμενος εμφανίζει ένα σχολιασμένο τμήμα κώδικα που δείχνει τον μηχανισμό λήψης μηνυμάτων από το κύριο νήμα, ο οποίος, λαμβάνοντας υπόψη τον ήδη συζητημένο μηχανισμό αποστολής μηνυμάτων, σας επιτρέπει να οργανώσετε αμφίδρομη ασύγχρονη ανταλλαγή δεδομένων μεταξύ του κύριου νήματος και του νήματος εργασίας.
  • Αποτελέσματα Σε αυτό το υλικό εμείς, στις πρακτικά παραδείγματα, εξετάσαμε τις δυνατότητες χρήσης νέων δυνατοτήτων για εργασία με ροές στο Node.js. Εάν έχετε κατακτήσει τι καλύπτεται εδώ, είστε έτοιμοι να αρχίσετε να πειραματίζεστε με τη λειτουργική μονάδα worker_threads αφού δείτε την τεκμηρίωση. Αξίζει επίσης να σημειωθεί ότι αυτή η δυνατότητα μόλις εμφανίστηκε στο Node.js, ενώ είναι ακόμα πειραματική, οπότε κάτι στην εφαρμογή της μπορεί να αλλάξει με την πάροδο του χρόνου. Επιπλέον, εάν κατά τη διάρκεια των δικών σας πειραμάτων με worker_threads αντιμετωπίσετε σφάλματα ή διαπιστώσετε ότι αυτή η λειτουργική μονάδα θα μπορούσε να χρησιμοποιήσει κάποια λειτουργία που λείπει, ενημερώστε τους προγραμματιστές σχετικά και συμβάλετε στη βελτίωση της πλατφόρμας Node.js.

    Αγαπητοι αναγνωστες!