当前位置:网站首页>Explication contextuelle du langage Go
Explication contextuelle du langage Go
2022-07-07 05:42:00 【Poussière coulée】
Table des matières
GO Dans la langue Context Détails de l'emballage
Author mogd 2022-06-28
Update mogd 2022-07-04
AdageRreality is merely an illusion, albeit a very persistent one.
Préface
Je me demande s'il y a des petits amis comme moi,Apprendre go Quand les bases de la langue,Besoin rencontré context Information,C'est direct context.TODO(),Pas d'étude approfondie Context
Laissez l'auteur en savoir plus Context Le sac est en train d'écrire un K8S CMDB Sur la plateforme, Penser à la nécessité d'initialiser les données (Est de créer admin Utilisateurs, Et les utilisateurs de tests , Et la répartition correspondante Casbin Autorité)
Parce que user Référence du module gin-vue-admin,Et dans GVA La section initialisation des données est également disponible dans , Cette partie du Code utilise Context
Lisez attentivement ,C'est vrai Context Le sac a une meilleure compréhension
L'amertume enfouie ne connaît souvent que sa forme et ne sait pas ce qu'elle veut dire , Ce n'est qu'en faisant des projets que nous pourrons vraiment maîtriser une langue
L'auteur lui - même a écrit K8S CMDB Interface arrière de la plate - forme ,gin-kubernetes
Celui - ci vient de commencer à écrire ,C'est très simple.,Si vous êtes intéressé, vous pouvez voir; J'espère que les grands feront des suggestions.
user Référence du module gin-vue-admin
Un.、Context Introduction
1.1 Context Qu'est - ce que c'est??
Context In Go1.7 Ajouter à Go Dans la Bibliothèque des normes linguistiques,- Oui. Goroutine Le contexte de,Contient Goroutine État de fonctionnement、Environnement、Informations sur le site, etc.
In Go servers, each incoming request is handled in its own goroutine. Request handlers often start additional goroutines to access backends such as databases and RPC services. The set of goroutines working on a request typically needs access to request-specific values such as the identity of the end user, authorization tokens, and the request’s deadline. When a request is canceled or times out, all the goroutines working on that request should exit quickly so the system can reclaim any resources they are using.
At Google, we developed a context package that makes it easy to pass request-scoped values, cancellation signals, and deadlines across API boundaries to all the goroutines involved in handling a requestGoEn service, Chaque demande sera indépendantegoroutineTraitement,ChaquegoroutineEn général, de nouveauxgoroutineEffectuer des travaux supplémentaires , Comme faire une base de données ouRPCAccès aux services. Comme dans la demandegoroutineBesoin de partager l'accès aux données demandées ,Par exemple,,Authentification de l'utilisateur,Autorisationtoken, Et la date limite de demande . En cas de demande d'annulation ou de délai d'attente , Tous lesgoroutineDevrait sortir immédiatement ,Récupération des ressources
IncontextLe sac de,Par là., Nous pouvons très commodément demandergoroutineTransfert des données demandées entre 、 Signal d'annulation et message de temporisation
D'après la présentation officielle,Context Emballé pour goroutine Transmettre des messages entre.C'est avec nous goroutine Utilisé entre channel C'est très similaire.,Mais c'est différent.Parce que dans un autre goroutine Il ne passe que done channel Trop peu d'informations
Et avec Context Introduction du paquet, De nombreuses interfaces de la Bibliothèque standard ont été ajoutées Context Paramètres,Context Est devenu presque la pratique standard pour le contrôle de la concurrence et le contrôle des temps d'arrêt
Context Utiliser le scénario
- Transmission d'informations contextuelles (request-scoped),Comme le traitement http Demande、 Transmission de l'information sur la chaîne de traitement des demandes
- Controller goroutine Fonctionnement
- Appel de méthode pour le contrôle des temps d'arrêt
- Appel de méthode annulable
1.2 Context Interface
context Au cœur de Context Type
// A Context carries a deadline, cancellation signal, and request-scoped values
// across API boundaries. Its methods are safe for simultaneous use by multiple
// goroutines.
type Context interface {
// Done returns a channel that is closed when this Context is canceled
// or times out.
Done() <-chan struct{
}
// Err indicates why this context was canceled, after the Done channel
// is closed.
Err() error
// Deadline returns the time when this Context will be canceled, if any.
Deadline() (deadline time.Time, ok bool)
// Value returns the value associated with key or nil if none.
Value(key interface{
}) interface{
}
}
DoneLa méthode renvoie unchannel, Il peut être utilisé pour recevoircontextSignal d'annulation de.QuandchannelFermer,ÉcouterDoneLa fonction du signal annule immédiatement le travail en cours et renvoieErrLa méthode renvoie unerrorVariables, On peut en déduire quecontextPourquoi il a été annulé .pipeline and cancelation - Oui.Done channelUne présentation détaillée a été faite.DeadlineLa méthode permet à la fonction de décider si le travail doit être démarré , Si le temps restant est trop court , Alors ça ne vaut pas la peine de commencer le travail .Dans le Code,On peut passer pardeadlinePour IO Délai de réglage de l'opérationValueComment fairecontextIngoroutinePartage des données dans le cadre de la demande entre , Ces données doivent être co - traitées et sécurisées simultanément
Si
DonePas parclose,ErrRetour de la méthodenil;SiDoneParclose,ErrLa méthode renvoieDoneParcloseRaisons
2.、Context Utilisation de
In
ContextPasser comme premier paramètre .Voilà., Même si différentes équipesGoLe Code peut aussi bien fonctionner .ContextTrès pratiquegoroutineTimeout and uncontrol for , Et assurer la transmission sécurisée des données vitales , Comme un certificat de sécurité
context Le package offre principalement deux façons de créer Context
- context.Background()
- context.TODO()
Les deux fonctions sont alias l'une de l'autre ,Pas de différence.,Définitions officielles:
context.BackgroundEst la valeur par défaut pour le contexte, Tous les autres contextes devraient en dériver (Derived) Sors de là.context.TODO()Ne devrait être utilisé que lorsque le contexte à utiliser n'est pas certain
Créé de ces deux façons context,Pas de fonction, Sa mise en œuvre repose sur context Fourni par le paquet with Série dérivée
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{
}) Context
Un projet pour Context Utilisation de, Avec ces quatre fonctions dérivées , Pour former un Context Nombre. Chaque noeud de l'arbre peut avoir n'importe quel nombre d'enfants ,Il peut y avoir plus d'un niveau de noeud, Chaque noeud enfant dépend du noeud parent
[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-SslcluBn-1656939722939)(./images/context-derive.png)]
2.1 WithValue Données de transport、Value Obtenir des données
Voici le projet Open Source GVA Par exemple, le Code de la section initialisation des données dans , Certains jugements et codes de données ont été supprimés ,C'est réservé. context Section
// InitDB Créer une base de données et initialiser Entrée principale
func (initDBService *InitDBService) InitDB(conf request.InitDB) (err error) {
ctx := context.TODO()
var initHandler TypedDBInitHandler
initHandler = NewMysqlInitHandler()
ctx = context.WithValue(ctx, "dbtype", "mysql")
ctx, _ = initHandler.EnsureDB(ctx, &conf)
db := ctx.Value("db").(*gorm.DB)
global.GVA_DB = db
if err = initHandler.WriteConfig(ctx); err != nil {
return err
}
if err = initHandler.InitTables(ctx, initializers); err != nil {
return err
}
if err = initHandler.InitData(ctx, initializers); err != nil {
return err
}
return nil
}
// EnsureDB Créer une base de données et initialiser mysql
func (h MysqlInitHandler) EnsureDB(ctx context.Context, conf *request.InitDB) (next context.Context, err error) {
if s, ok := ctx.Value("dbtype").(string); !ok || s != "mysql" {
return ctx, ErrDBTypeMismatch
}
c := conf.ToMysqlConfig()
next = context.WithValue(ctx, "config", c)
next = context.WithValue(next, "db", db)
}
// WriteConfig mysql Mise à jour de la configuration
func (h MysqlInitHandler) WriteConfig(ctx context.Context) error {
c, _ := ctx.Value("config").(config.Mysql)
global.GVA_CONFIG.Mysql = c
return global.GVA_VP.WriteConfig()
}
Basé sur context.TODO() Créé un ctx,Adoption context.WithValue Oui. dbtype, config Et db Écrire context,Et à travers context Transmission des arbres , Tout dérivé de context Ont accès à ces trois informations
Dans le Code context Processus:
InitDBÉcriredbtype,EnsureDBAdoptionValueAccèsdbtypeDéterminer si le type de base de données est correctEnsureDBÉcrireconfigEtdbInformationWriteConfigAccèsconfigRetour au profil de contenuInitDBAccèsdbInformation,Assigner une valeur à une variable globale,Je l'ai.gorm.DBClient
Pour withValue Il y a quatre précautions pour l'utilisation de :
- Non recommandé
contextParamètres clés de transfert de valeur,Les paramètres clés doivent être affichés avec une déclaration,Il ne faut pas traiter implicitement - Transport
valueC'est aussikey、valueForme,Pour évitercontextParce que plusieurs paquets sont utilisés en même tempscontextEt apporter des conflits,keyLe type intégré est recommandé - Obtenir la paire de clés , Doit commencer par le courant
contextRecherche dans,Je n'ai pas trouvé ce qui allait arriver du pèrecontextTrouve la valeur de cette clé jusqu'à ce qu'elle soit dans un parentcontextRetour au milieunilOu trouver la valeur correspondante contextParmi les données transmiseskey、valueTous.interfaceType,Le temps de compilation de ce type ne peut pas déterminer le type,Donc ce n'est pas très sûr,N'oubliez donc pas de garantir la robustesse du programme lors de l'affirmation de type
2.2 WithCancel Annuler le contrôle
Dans le développement quotidien des affaires, il y a souvent plus d'une demande complexe goroutine Pour faire quelque chose,Cela nous amène à ouvrir plus d'une demande goroutine Je ne peux vraiment pas les contrôler,C'est là que nous pouvons utiliser withCancel Pour dériver un context Passer à un autre goroutine Moyenne, Quand on veut que ça goroutine Arrête de courir,Pour appeler cancel Pour annuler
L'exemple ci - dessus est le suivant InitTables Et InitData Section
func (h MysqlInitHandler) InitTables(ctx context.Context, inits initSlice) error {
return createTables(ctx, inits)
}
// createTables Créer une table(Par défaut dbInitHandler.initTables Comportement)
func createTables(ctx context.Context, inits initSlice) error {
next, cancel := context.WithCancel(ctx)
defer func(c func()) {
c() }(cancel)
return nil
}
func (h MysqlInitHandler) InitData(ctx context.Context, inits initSlice) error {
next, cancel := context.WithCancel(ctx)
defer func(c func()) {
c() }(cancel)
return nil
}
Mais GVA Cette partie de l'exemple n'est pas beaucoup goroutine De, Plus de présentation context Transmission d'informations contextuelles
Donc le contrôle est annulé , Voir l'exemple suivant pour plus de détails context Contrôle goroutine
func main() {
ctx,cancel := context.WithCancel(context.Background())
go CancelText(ctx)
time.Sleep(10*time.Second)
cancel()
time.Sleep(1*time.Second)
}
func CancelText(ctx context.Context) {
for range time.Tick(time.Second){
select {
case <- ctx.Done():
fmt.Println("stop time")
return
default:
fmt.Println("start time")
}
}
}
Utiliser WithCancel Créer un Background De ctx; main Appel principal de la fonction CancelText Sous - processus, Sous - programme imprimé en continu start time,Jusqu'à ctx.Done() Fermeture réussie
Le programme principal est 10s Mise en œuvre postérieure cancel,CancelText Sortie du sous - programme après la détection du signal d'annulation
RÉFÉRENCES
[1] Go Concurrency Patterns: Context
[2] Xiaobai peut comprendre.contextDétails de l'emballage:De l'initiation à la maîtrise
边栏推荐
- Intelligent annotation scheme of entity recognition based on hugging Face Pre training model: generate doccano request JSON format
- Leetcode 1189 maximum number of "balloons" [map] the leetcode road of heroding
- Cve-2021-3156 vulnerability recurrence notes
- C nullable type
- Differences and introduction of cluster, distributed and microservice
- [Oracle] simple date and time formatting and sorting problem
- Educational Codeforces Round 22 B. The Golden Age
- Use, configuration and points for attention of network layer protocol (taking QoS as an example) when using OPNET for network simulation
- Getting started with DES encryption
- Leakage relay jd1-100
猜你喜欢

Design, configuration and points for attention of network unicast (one server, multiple clients) simulation using OPNET

ForkJoin最全详解(从原理设计到使用图解)

English grammar_ Noun possessive

不同网段之间实现GDB远程调试功能

How does mapbox switch markup languages?

Initial experience of annotation

High voltage leakage relay bld-20

Jhok-zbl1 leakage relay

Web architecture design process

Mapbox Chinese map address
随机推荐
毕业之后才知道的——知网查重原理以及降重举例
[JS component] date display.
[binary tree] binary tree path finding
App clear data source code tracking
《2022中国低/无代码市场研究及选型评估报告》发布
Message queuing: how to ensure that messages are not lost
三级菜单数据实现,实现嵌套三级菜单数据
Initial experience of annotation
Leetcode: maximum number of "balloons"
How Alibaba cloud's DPCA architecture works | popular science diagram
拼多多商品详情接口、拼多多商品基本信息、拼多多商品属性接口
MySQL数据库学习(7) -- pymysql简单介绍
Flinksql 读写pgsql
Educational Codeforces Round 22 B. The Golden Age
What are the common message queues?
The navigation bar changes colors according to the route
Distributed global ID generation scheme
JVM (19) -- bytecode and class loading (4) -- talk about class loader again
基于NCF的多模块协同实例
Mybaits multi table query (joint query, nested query)