Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Alexey Naidenov, Διευθύνων Σύμβουλος ITooLabs, μιλά για την ανάπτυξη τηλεπικοινωνιακής πλατφόρμας για τηλεπικοινωνιακούς φορείς στη γλώσσα προγραμματισμού Go (Golang). Ο Alexey μοιράζεται επίσης την εμπειρία του από την ανάπτυξη και τη λειτουργία της πλατφόρμας σε έναν από τους μεγαλύτερους ασιατικούς τηλεπικοινωνιακούς φορείς, ο οποίος χρησιμοποίησε την πλατφόρμα για την παροχή υπηρεσιών φωνητικού ταχυδρομείου (VoiceMail) και Virtual PBX (Cloud PBX).

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Alexey Naydenov (εφεξής - AN): - Γεια σε όλους! Το όνομά μου είναι Alexey Naidenov. Είμαι ο διευθυντής του ITooLabs. Πρώτα από όλα θα ήθελα να απαντήσω τι κάνω εδώ και πώς κατέληξα εδώ.

Αν κοιτάξετε το Bitrix24 Marketplace (ενότητα "Τηλεφωνία"), τότε 14 εφαρμογές και 36 που υπάρχουν (40%) είμαστε εμείς:

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Πιο συγκεκριμένα, αυτοί είναι οι συνεργάτες μας, αλλά πίσω από όλα αυτά βρίσκεται η πλατφόρμα μας (Platform as a Service) - αυτό που τους πουλάμε για μια μικρή δεκάρα. Στην πραγματικότητα, θα ήθελα να μιλήσω για την ανάπτυξη αυτής της πλατφόρμας και για το πώς φτάσαμε στο Go.

Οι αριθμοί για την πλατφόρμα μας τώρα είναι:

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

44 συνεργαζόμενοι χειριστές, συμπεριλαμβανομένου του MegaFon. Σε γενικές γραμμές, μας αρέσει να πηγαίνουμε σε περιπέτειες και έχουμε πρόσβαση σε 100 εκατομμύρια συνδρομητές 44 παρόχων εδώ στη Ρωσία. Επομένως, εάν κάποιος έχει κάποιες επιχειρηματικές ιδέες, είμαστε πάντα στην ευχάριστη θέση να τις ακούσουμε.

  • 5000 εταιρείες χρηστών.
  • 20 συνδρομητές συνολικά. Είναι όλα b000b - συνεργαζόμαστε μόνο με εταιρείες.
  • 300 κλήσεις ανά λεπτό κατά τη διάρκεια της ημέρας.
  • 100 εκατομμύρια λεπτά κλήσεων πέρυσι (γιορτάσαμε). Αυτό γίνεται χωρίς να λαμβάνονται υπόψη οι εσωτερικές διαπραγματεύσεις που βρίσκονται στην πλατφόρμα μας.

Πώς ξεκίνησε;

Πώς αρχίζουν οι σωστοί τύποι να φτιάχνουν τη δική τους πλατφόρμα; Θα πρέπει επίσης να ληφθεί υπόψη ότι είχαμε ιστορικό ανάπτυξης «σκληροπυρηνικών επιχειρήσεων» και μάλιστα την πιο ακριβή περίοδο του χρόνου για μια επιχείρηση! Ήταν εκείνη η χαρούμενη στιγμή που έρχεσαι στον πελάτη και λες: "Χρειαζόμαστε μερικούς ακόμη διακομιστές." Και ο πελάτης: «Ναι, καμία ερώτηση! Έχουμε ένα δεκάρι στο ράφι.

Κάναμε λοιπόν Oracle, Java, WebSphere, Db2 και όλα αυτά. Ως εκ τούτου, πήραμε, φυσικά, τις καλύτερες λύσεις προμηθευτών, τις ενσωματώσαμε και προσπαθήσαμε να τις απογειώσουμε. Έπαιξαν μόνοι τους. Θα ήταν μια τέτοια εσωτερική εκκίνηση.

Όλα ξεκίνησαν το 2009. Από το 2006, συμμετέχουμε στενά στις αποφάσεις των χειριστών, με τον ένα ή τον άλλο τρόπο. Κατασκευάσαμε πολλά προσαρμοσμένα εικονικά PBX (όπως αυτά που έχουμε τώρα κατά παραγγελία): κοιτάξαμε, αποφασίσαμε ότι ήταν καλό και αποφασίσαμε να ξεκινήσουμε μια εσωτερική εκκίνηση.

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Πάρτε το VMWare. Δεδομένου ότι περπατούσαμε μόνοι μας, έπρεπε να εγκαταλείψουμε αμέσως το cool πωλητή Storage. Γνωρίζουμε τα πάντα για αυτούς: ότι οι υποσχέσεις πρέπει να διαιρεθούν με το 3 και το κόστος πρέπει να πολλαπλασιαστεί με το 10. Επομένως, κάναμε DirDB και ούτω καθεξής.

Μετά άρχισε να μεγαλώνει. Η υπηρεσία χρέωσης προστέθηκε σε αυτό, επειδή η πλατφόρμα δεν μπορούσε πλέον να αντεπεξέλθει. Στη συνέχεια, ο διακομιστής χρέωσης από τη MySQL μεταφέρθηκε στο Mongo. Ως αποτέλεσμα, έχουμε μια λειτουργική λύση που επεξεργάζεται όλες τις κλήσεις που πηγαίνουν εκεί:

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Αλλά κάπου μέσα, περιστρέφεται το ίδιο προϊόν πωλητή - το κύριο, πυρηνικό, που πήραμε κάποτε. Περίπου στα τέλη του 2011, συνειδητοποιήσαμε μόνοι μας ότι το κύριο εμπόδιο για εμάς, φυσικά, θα είναι αυτό το συγκεκριμένο προϊόν - θα το αντιμετωπίσουμε. Είδαμε μπροστά μας έναν τοίχο, μέσα στον οποίο τρέχαμε με πλήρη καλπασμό, καθώς οι πελάτες περπατούσαν, προστέθηκαν.
Αντίστοιχα, έπρεπε να κάνουμε κάτι. Φυσικά, κάναμε αρκετή έρευνα για διάφορα προϊόντα - τόσο ανοιχτού κώδικα όσο και προμηθευτών. Δεν θα σταθώ σε αυτό τώρα - δεν είναι αυτό το θέμα. Η τελευταία εναλλακτική που σκεφτήκαμε ήταν να φτιάξουμε τη δική μας πλατφόρμα.

Τελικά, καταλήξαμε σε αυτήν την επιλογή. Γιατί; Επειδή όλα τα προϊόντα πωλητή και ανοιχτού κώδικα δημιουργήθηκαν για να λύνουν προβλήματα πριν από 10 χρόνια. Λοιπόν, αν ένα 10χρονο, και μερικά ακόμα! Η επιλογή έχει γίνει προφανής για εμάς: είτε αποχαιρετούμε την υπέροχη ιδέα μας για μια ιδανική υπηρεσία (για συνεργάτες, χειριστές και εμάς), είτε κάνουμε κάτι δικό μας.

Αποφασίσαμε να κάνουμε κάτι διαφορετικό!

Απαιτήσεις πλατφόρμας

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

  1. Υψηλή ταχύτητα ανάπτυξης. Το προϊόν του πωλητή, που μας βασάνιζε, δεν μας ταίριαζε εξαρχής γιατί όλα πήγαιναν καλά για πολύ καιρό και αργά. Θέλαμε γρήγορα – είχαμε πολλές ιδέες! Έχουμε ακόμα πολλές ιδέες, αλλά τότε ο κατάλογος των ιδεών ήταν τέτοιος που φαινόταν σαν δέκα χρόνια μπροστά. Τώρα μόνο για ένα χρόνο.
  2. Μέγιστη χρήση σιδήρου πολλαπλών πυρήνων. Αυτό ήταν επίσης σημαντικό για εμάς, γιατί είδαμε ότι θα υπήρχαν όλο και περισσότεροι πυρήνες.
  3. Υψηλή αξιοπιστία. Αυτός που κλάψαμε κι εμείς.
  4. Υψηλή ανοχή σφαλμάτων.
  5. Θέλαμε να καταλήξουμε σε μια καθημερινή διαδικασία απελευθέρωσης. Για να γίνει αυτό, χρειαζόμασταν μια επιλογή γλώσσας.

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

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

  1. Εάν θέλουμε υποστήριξη για συστήματα πολλαπλών πυρήνων, τότε χρειαζόμαστε υποστήριξη για παράλληλη εκτέλεση.
  2. Αν χρειαζόμαστε ταχύτητα ανάπτυξης, χρειαζόμαστε μια γλώσσα που να υποστηρίζει την ανταγωνιστική ανάπτυξη, τον ανταγωνιστικό προγραμματισμό. Αν κάποιος δεν έχει συναντήσει τη διαφορά, τότε είναι πολύ απλό:
    • Ο παράλληλος προγραμματισμός αφορά τον τρόπο λειτουργίας δύο διαφορετικών νημάτων σε διαφορετικούς πυρήνες.
    • Η ταυτόχρονη εκτέλεση, πιο συγκεκριμένα η υποστήριξη ταυτόχρονης λειτουργίας, αφορά τον τρόπο με τον οποίο η γλώσσα (ή ο χρόνος εκτέλεσης, οτιδήποτε) βοηθά στην απόκρυψη όλης της πολυπλοκότητας που προκύπτει από την παράλληλη εκτέλεση.
  3. Υψηλή σταθερότητα. Προφανώς, χρειαζόμασταν ένα σύμπλεγμα και ήταν καλύτερο από αυτό που είχαμε στο προϊόν του πωλητή.

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Δεν είχαμε πολλές επιλογές, αν θυμάστε. Πρώτον, Erlang - το αγαπάμε και το ξέρουμε, ήταν το προσωπικό, προσωπικό μου αγαπημένο. Δεύτερον, η Java δεν είναι καν Java, αλλά συγκεκριμένα Scala. Τρίτον, η γλώσσα που εκείνη την εποχή δεν ξέραμε καθόλου - Go. Είχε μόλις εμφανιστεί τότε, πιο συγκεκριμένα, υπήρχε ήδη δύο χρόνια περίπου, αλλά δεν είχε κυκλοφορήσει ακόμα.

Νικημένος Go!

Ιστορία του Go

Κάναμε μια πλατφόρμα πάνω του. Θα προσπαθήσω να εξηγήσω γιατί.

Μια σύντομη ιστορία του Go. Ξεκίνησε το 2007, άνοιξε το 2009, η πρώτη έκδοση κυκλοφόρησε το 2012 (δηλαδή ξεκινήσαμε να δουλεύουμε πριν από την πρώτη κυκλοφορία). Ο εμπνευστής ήταν η Google, η οποία ήθελε να αντικαταστήσει, όπως υποπτεύομαι, την Java.

Οι συγγραφείς είναι πολύ διάσημοι:

  • Ο Ken Thomson, ο οποίος ήταν πίσω από το Unix, εφηύρε το UTF-8, εργάστηκε στο σύστημα Plan 9.
  • Ο Rob Pike, ο οποίος σχεδίασε το UTF-8 με τον Ken, εργάστηκε επίσης στο Plan 9, Inferno, Limbo στα Bell Labs.
  • Robert Gizmer, τον οποίο γνωρίζουμε και αγαπάμε για την εφεύρεση του Java HotSpot Compiler και για την εργασία στη γεννήτρια στο V8 (διερμηνέας Javascript της Google).
  • Και πάνω από 700 συνεισφέροντες, συμπεριλαμβανομένων ορισμένων από τις ενημερώσεις κώδικα.

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Πήγαινε με μια ματιά

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

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Μπορεί να φανεί ότι είναι της μόδας να περιγράφονται οι δομές. Φαίνεται ότι έχουμε την έννοια του δείκτη (όπου είναι ο αστερίσκος). Μπορεί να φανεί ότι υπάρχει ειδική υποστήριξη για τη δήλωση αρχικοποίησης πινάκων και συσχετιστικών πινάκων.

Σχεδόν κατανοητό - μπορείς να ζήσεις. Προσπαθώ να γράψω Hello, world:

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Τι βλέπουμε; Αυτή είναι σύνταξη τύπου C, το ερωτηματικό είναι προαιρετικό. Μπορεί να είναι διαχωριστικό για δύο γραμμές, αλλά μόνο εάν πρόκειται για δύο κατασκευές που βρίσκονται ακριβώς στην ίδια γραμμή.

Βλέπουμε ότι οι αγκύλες στις δομές ελέγχου (στη 14η γραμμή) είναι προαιρετικές, αλλά απαιτούνται πάντα σγουρές. Βλέπουμε ότι η πληκτρολόγηση είναι στατική. Ο χρόνος στις περισσότερες περιπτώσεις εμφανίζεται. Αυτό το παράδειγμα είναι ελαφρώς πιο περίπλοκο από το συνηθισμένο Hello, world - απλώς για να δείξει ότι υπάρχει βιβλιοθήκη.

Τι άλλο βλέπουμε σημαντικό; Ο κώδικας είναι οργανωμένος σε πακέτα. Και για να χρησιμοποιήσετε το πακέτο στον δικό σας κωδικό, πρέπει να το εισαγάγετε χρησιμοποιώντας την οδηγία εισαγωγής - αυτό είναι επίσης σημαντικό. Ξεκινάμε - λειτουργεί. Εξαιρετική!

Ας δοκιμάσουμε κάτι πιο περίπλοκο: Γεια σας, κόσμος, αλλά τώρα είναι ένας διακομιστής http. Τι ενδιαφέρον βλέπουμε εδώ;

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

Πρώτον, η συνάρτηση λειτουργεί ως παράμετρος. Αυτό σημαίνει ότι η λειτουργία που έχουμε είναι «πολίτης πρώτης κατηγορίας» και μπορείτε να κάνετε πολλά ενδιαφέροντα πράγματα με αυτήν σε λειτουργικό στυλ. Βλέπουμε το απροσδόκητο επόμενο: η οδηγία εισαγωγής αναφέρεται απευθείας στο αποθετήριο GitHub. Έτσι είναι, έτσι είναι - άλλωστε έτσι πρέπει να γίνεται.

Στο Go, το καθολικό αναγνωριστικό ενός πακέτου είναι το url του αποθετηρίου του. Υπάρχει ένα ειδικό βοηθητικό πρόγραμμα Goget που πηγαίνει για όλες τις εξαρτήσεις, τις κατεβάζει, τις εγκαθιστά, τις μεταγλωττίζει και τις προετοιμάζει για χρήση εάν είναι απαραίτητο. Ταυτόχρονα, ο Goget γνωρίζει για το html-meta. Αντίστοιχα, μπορείτε να διατηρήσετε έναν κατάλογο http, ο οποίος θα περιέχει συνδέσμους προς το συγκεκριμένο αποθετήριο σας (όπως εμείς, για παράδειγμα, κάνουμε).

Τι άλλο βλέπουμε; Http και Json στην κανονική βιβλιοθήκη. Υπάρχει, προφανώς, ενδοσκόπηση - αναστοχασμός, που θα πρέπει να χρησιμοποιηθεί στην κωδικοποίηση / json, γιατί απλώς αντικαθιστούμε κάποιο αυθαίρετο αντικείμενο.

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

Συνεχίζοντας.

Go: μέθοδοι και διεπαφές

Το Go έχει μεθόδους. Μπορείτε να δηλώσετε μια μέθοδο για οποιονδήποτε προσαρμοσμένο τύπο. Επιπλέον, αυτό δεν είναι απαραίτητα μια δομή, αλλά μπορεί να είναι ένα ψευδώνυμο κάποιου τύπου. Μπορείτε να δηλώσετε ένα ψευδώνυμο για το N32 και να γράψετε μεθόδους για να κάνει κάτι χρήσιμο.

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

Ερώτηση! Τι μας έδωσε η εταιρεία συγγραφέων με επικεφαλής την Google για να προβάλουμε την πολυπλοκότητα του κόσμου; Μας δόθηκαν διεπαφές!

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

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

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

Και υπάρχουν, φυσικά, δείκτες για ακύρωση στο Go. Η λέξη διεπαφή {} (με δύο σγουρά άγκιστρα) είναι μια μεταβλητή που σας επιτρέπει να δείχνετε κατ' αρχήν οποιοδήποτε αντικείμενο.
Μέχρι στιγμής όλα είναι εντάξει, όλα γνώριμα. Τίποτα το περίεργο.

Πήγαινε: γορουτίνες

Τώρα ερχόμαστε σε αυτό που μας ενδιαφέρει: ελαφριές διαδικασίες - γορουτίνες (γκορουτίνες) στην ορολογία Go.

Alexey Naidenov. ITooLabs. Θήκη ανάπτυξης στην τηλεφωνική πλατφόρμα Go (Golang). Μέρος 1

  1. Πρώτον, είναι πραγματικά ελαφρύ (λιγότερο από 2 Kb).
  2. Δεύτερον, το κόστος δημιουργίας μιας τέτοιας γορουτίνας είναι αμελητέο: μπορείτε να δημιουργήσετε χίλια από αυτά το δευτερόλεπτο - τίποτα δεν θα συμβεί.
  3. Εξυπηρετούνται από τον δικό τους χρονοπρογραμματιστή, ο οποίος απλώς μεταφέρει τον έλεγχο από τη μια γορουτίνα στην άλλη.
  4. Στην περίπτωση αυτή, ο έλεγχος μεταφέρεται στις ακόλουθες περιπτώσεις:
    • εάν εμφανιστεί μια δήλωση go (εάν η γορουτίνα ξεκινά την επόμενη γορουτίνα).
    • εάν είναι ενεργοποιημένη μια αποκλειστική κλήση εισόδου/εξόδου.
    • εάν ενεργοποιηθεί η συλλογή απορριμμάτων·
    • εάν ξεκινήσει κάποια λειτουργία με κανάλια.

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

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

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

Αυτό το απλό παράδειγμα 21 γραμμών είναι ένα παράδειγμα που κάνει απλώς echo-server. Ταυτόχρονα, σημειώστε ότι η συνάρτηση εξυπηρέτησης είναι εξαιρετικά απλή, είναι γραμμική. Δεν υπάρχουν ανακλήσεις, δεν χρειάζεται να ταλαιπωρηθείτε και να σκεφτείτε... Απλά διαβάζετε και γράφετε!

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

Συνέχεια πολύ σύντομα...

Μερικές διαφημίσεις 🙂

Σας ευχαριστούμε που μείνατε μαζί μας. Σας αρέσουν τα άρθρα μας; Θέλετε να δείτε πιο ενδιαφέρον περιεχόμενο; Υποστηρίξτε μας κάνοντας μια παραγγελία ή προτείνοντας σε φίλους, cloud VPS για προγραμματιστές από 4.99 $, ένα μοναδικό ανάλογο διακομιστών εισαγωγικού επιπέδου, το οποίο εφευρέθηκε από εμάς για εσάς: Όλη η αλήθεια για το VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps από 19 $ ή πώς να μοιραστείτε έναν διακομιστή; (διατίθεται με RAID1 και RAID10, έως 24 πυρήνες και έως 40 GB DDR4).

Το Dell R730xd 2 φορές φθηνότερο στο κέντρο δεδομένων Equinix Tier IV στο Άμστερνταμ; Μόνο εδώ 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 Τηλεόραση από 199$ στην Ολλανδία! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - από 99$! Διαβάστε σχετικά Πώς να χτίσετε την υποδομή Corp. κατηγορίας με τη χρήση διακομιστών Dell R730xd E5-2650 v4 αξίας 9000 ευρώ για μια δεκάρα;

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο