τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Οι γορουτίνες εκτελούνται στον ίδιο χώρο διευθύνσεων, επομένως η πρόσβαση στην κοινόχρηστη μνήμη πρέπει να είναι συγχρονισμένη.Οι γορουτίνες μοιράζονται τη μνήμη μέσω της επικοινωνίας, αντί να μοιράζονται τη μνήμη.
Το κανάλι τύπου αναφοράς είναι μια συγκεκριμένη υλοποίηση του τρόπου λειτουργίας CSP και χρησιμοποιείται για πολλαπλή επικοινωνία γορουτίνας. Εφαρμόζει συγχρονισμό εσωτερικά για να εξασφαλίσει ασφάλεια ταυτόχρονης χρήσης.
Όπως ο χάρτης, το κανάλι είναι επίσης μια αναφορά στην υποκείμενη δομή δεδομένων που δημιουργείται από τη μάρκα.
Όταν αντιγράφουμε ένα κανάλι ή το χρησιμοποιούμε για τη μετάδοση παραμέτρων συνάρτησης, απλώς αντιγράφουμε μια αναφορά καναλιού, έτσι ο καλών και ο καλούμενος θα αναφέρονται στο ίδιο αντικείμενο καναλιού. Όπως και άλλοι τύποι αναφοράς, η μηδενική τιμή του καναλιού είναι μηδενική.
Όταν ορίζετε ένα κανάλι, πρέπει επίσης να ορίσετε τον τύπο των τιμών που αποστέλλονται στο κανάλι. Τα κανάλια μπορούν να δημιουργηθούν χρησιμοποιώντας την ενσωματωμένη συνάρτηση make():
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
Από προεπιλογή, το κανάλι μπλοκάρει κατά τη λήψη και την αποστολή δεδομένων, εκτός εάν το άλλο άκρο είναι έτοιμο, καθιστώντας τον συγχρονισμό γορουτίνας απλούστερο χωρίς να χρειάζονται ρητά κλείδωμα.
Ένα κανάλι χωρίς προσωρινή αποθήκευση είναι ένα κανάλι που δεν έχει τη δυνατότητα να αποθηκεύσει καμία τιμή πριν από τη λήψη.
Αυτός ο τύπος καναλιού απαιτεί η γορουτίνα αποστολής και η γορουτίνα λήψης να είναι έτοιμα ταυτόχρονα για να ολοκληρώσουν τις λειτουργίες αποστολής και λήψης. Εάν δύο γορουτίνες δεν είναι έτοιμες ταυτόχρονα, το κανάλι θα κάνει τη γορουτίνα που εκτελεί πρώτα τη λειτουργία αποστολής ή λήψης να μπλοκάρει και να περιμένει.
Αυτή η αλληλεπίδραση αποστολής και λήψης στο κανάλι είναι εγγενώς σύγχρονη. Καμία λειτουργία δεν μπορεί να υπάρχει ανεξάρτητα από την άλλη.
Το παρακάτω σχήμα δείχνει πώς δύο γορουτίνες μπορούν να μοιραστούν μια τιμή χρησιμοποιώντας κανάλια χωρίς προσωρινή αποθήκευση:
make (chan Type)//等价于make (chan Type,0)
Εάν δεν έχει καθοριστεί μέγεθος buffer, το κανάλι είναι σύγχρονο και επομένως μπλοκάρει έως ότου ο αποστολέας είναι έτοιμος για αποστολή και ο δέκτης είναι έτοιμος για λήψη.
Ένα κανάλι προσωρινής αποθήκευσης είναι ένα κανάλι που μπορεί να αποθηκεύσει μία ή περισσότερες τιμές πριν ληφθεί.
Αυτός ο τύπος καναλιού δεν απαιτεί ότι η γορουτίνα πρέπει να ολοκληρώσει την αποστολή και τη λήψη ταυτόχρονα. Τα κανάλια θα έχουν επίσης διαφορετικές συνθήκες που αποκλείουν ενέργειες αποστολής και λήψης. Η ενέργεια λήψης θα αποκλειστεί μόνο εάν δεν υπάρχει τιμή στο κανάλι προς λήψη. Η ενέργεια αποστολής θα αποκλειστεί μόνο εάν το κανάλι δεν έχει διαθέσιμο buffer για να χωρέσει την τιμή που αποστέλλεται.
Αυτό οδηγεί σε μια μεγάλη διαφορά μεταξύ των καναλιών με προσωρινή αποθήκευση και χωρίς προσωρινή αποθήκευση: τα κανάλια χωρίς προσωρινή αποθήκευση εγγυώνται ότι η αποστολή και η λήψη γορουτίνες θα ανταλλάσσουν δεδομένα ταυτόχρονα: τα κανάλια στην προσωρινή μνήμη δεν έχουν τέτοια εγγύηση.
make (chan Type,capacity)
Εάν δοθεί χωρητικότητα buffer, το κανάλι είναι ασύγχρονο. Εφόσον το buffer έχει αχρησιμοποίητο χώρο για την αποστολή δεδομένων ή περιέχει δεδομένα που μπορούν να ληφθούν, η επικοινωνία συνεχίζεται χωρίς αποκλεισμό.
Το κανάλι μπορεί να χρησιμοποιήσει το ok για να εντοπίσει εάν το κανάλι είναι ακόμα ανοιχτό, τα δεδομένα δεν θα διαβαστούν.
num ,ok:=<-ch
Μπορεί να εντοπίσει εάν ένα κανάλι είναι κλειστό.Από προεπιλογή, το κανάλι είναι διπλής ερώτησης, δηλαδή, μπορείτε να στείλετε δεδομένα σε αυτό και να λάβετε δεδομένα από αυτό.
Ωστόσο, βλέπουμε συχνά ένα κανάλι να μεταδίδεται ως παράμετρος και η τιμή αναμένεται να χρησιμοποιηθεί προς μία κατεύθυνση, είτε για αποστολή δεδομένων είτε μόνο για λήψη δεδομένων Αυτή τη στιγμή, μπορούμε να καθορίσουμε την κατεύθυνση του καναλιού. Η δήλωση μιας μονόδρομης μεταβλητής chamel είναι πολύ απλή, ως εξής:
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- σημαίνει ότι τα δεδομένα εισέρχονται στον σωλήνα και τα δεδομένα εγγράφονται στον σωλήνα, ο οποίος εξάγεται στον καλούντα.
Το <-chan υποδηλώνει ότι τα δεδομένα βγαίνουν από το σωλήνα.
Ένα κανάλι μπορεί σιωπηρά να μετατραπεί σε ουρά μονής κατεύθυνσης, μόνο λήψη ή αποστολή, αλλά ένα μονόδρομο κανάλι δεν μπορεί να μετατραπεί σε κανονικό κανάλι.