Écrivez le canal en synchronisation.WaitGroup goroutine
L'éditeur PHP Youzi présentera une méthode d'écriture de chan en goroutine sync.WaitGroup. En programmation simultanée, sync.WaitGroup est un mécanisme de synchronisation très utile qui peut attendre la fin de l'exécution d'un groupe de goroutines. Cependant, nous devons parfois écrire les résultats sur un chan une fois que la goroutine a terminé son exécution pour être consommés par d'autres goroutines. Cet article présentera en détail comment implémenter cette fonction dans la goroutine sync.WaitGroup, jetons un coup d'oeil !
Contenu de la question
Je reçois une liste d'éléments provenant d'un point de terminaison d'API. Ensuite, pour chaque projet, je fais une autre requête API pour obtenir des données sur le projet individuel.
Je ne peux pas faire une deuxième requête API à chaque projet en même temps car mon jeton API est limité en débit et si je fais trop de requêtes en même temps, je suis limité.
Cependant, les données de réponse initiales de l'API peuvent être divisées en plusieurs pages, ce qui me permet de traiter des pages de données simultanément.
Après quelques recherches, le code ci-dessous fait exactement ce que je veux :
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } go func() { wg.Wait() close(results) }() for result := range results { fmt.Println(result) } }
Je veux comprendre pourquoi ça marche :
go func() { wg.Wait() close(results) }()
Ma première tentative a échoué - je pensais pouvoir lire le résultat pendant wg.Wait()
之后遍历通道,并且我会在结果写入 results
la canalisation.
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } // does not work wg.Wait() close(results) for result := range results { fmt.Println(result) } }
Solution
Lors de votre premier essai :
- La goroutine principale fait que 3 goroutines mettent des valeurs dans le canal de résultat.
- La coroutine principale attend que toutes les coroutines soient terminées.
- L'une des goroutines met une valeur dans le canal de résultat et remplit le canal (la taille du canal est de 1 chaîne).
- Maintenant, les trois goroutines ne peuvent plus mettre de valeurs dans le canal de résultats et se mettre en veille jusqu'à ce que le canal de résultats soit libéré.
- Tous les goroutines sont en état de veille. Vous êtes dans une impasse.
Au deuxième essai :
- La goroutine principale contient 4 goroutines.
- 3 goroutines pour mettre des valeurs dans les canaux de résultats.
- L'autre goroutine (je l'appellerai la 4ème) attend la fin de ces 3 goroutines.
- En même temps, la coroutine principale attend la valeur dans le canal de résultat (boucle for)
- Dans ce cas, si l'une des goroutines met une valeur dans le canal de résultat, elle bloque les trois goroutines restantes ; la goroutine principale retire la valeur du canal de résultat, débloquant ainsi les autres goroutines.
- Donc les 3 goroutines mettent leurs valeurs respectives et terminent
- Puis la quatrième goroutine ferme la chaîne
- La Goroutine principale termine sa boucle for.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe une relation parent-enfant entre les fonctions et les goroutines dans Go. La goroutine parent crée la goroutine enfant, et la goroutine enfant peut accéder aux variables de la goroutine parent mais pas l'inverse. Créez une goroutine enfant à l'aide du mot-clé go, et la goroutine enfant est exécutée via une fonction anonyme ou une fonction nommée. La goroutine parent peut attendre que la goroutine enfant se termine via sync.WaitGroup pour s'assurer que le programme ne se termine pas avant que toutes les goroutines enfants ne soient terminées.

Les fonctions sont utilisées pour effectuer des tâches de manière séquentielle et sont simples et faciles à utiliser, mais elles présentent des problèmes de blocage et de contraintes de ressources. Goroutine est un thread léger qui exécute des tâches simultanément. Il possède des capacités élevées de simultanéité, d'évolutivité et de traitement des événements, mais il est complexe à utiliser, coûteux et difficile à déboguer. En combat réel, Goroutine a généralement de meilleures performances que les fonctions lors de l'exécution de tâches simultanées.

Le framework de collection Java gère la concurrence via des collections thread-safe et des mécanismes de contrôle de concurrence. Les collections thread-safe (telles que CopyOnWriteArrayList) garantissent la cohérence des données, tandis que les collections non thread-safe (telles que ArrayList) nécessitent une synchronisation externe. Java fournit des mécanismes tels que des verrous, des opérations atomiques, ConcurrentHashMap et CopyOnWriteArrayList pour contrôler la concurrence, garantissant ainsi l'intégrité et la cohérence des données dans un environnement multithread.

Dans un environnement multi-thread, le comportement des fonctions PHP dépend de leur type : Fonctions normales : thread-safe, peuvent être exécutées simultanément. Fonctions qui modifient les variables globales : dangereuses, doivent utiliser un mécanisme de synchronisation. Fonction d'opération de fichier : dangereuse, nécessité d'utiliser un mécanisme de synchronisation pour coordonner l'accès. Fonction d'exploitation de la base de données : dangereux, le mécanisme du système de base de données doit être utilisé pour éviter les conflits.

Les méthodes de communication inter-thread en C++ incluent : la mémoire partagée, les mécanismes de synchronisation (verrous mutex, variables de condition), les canaux et les files d'attente de messages. Par exemple, utilisez un verrou mutex pour protéger un compteur partagé : déclarez un verrou mutex (m) et une variable partagée (counter) ; chaque thread met à jour le compteur en verrouillant (lock_guard) ; pour éviter les conditions de course.

Le cadre de programmation simultanée C++ propose les options suivantes : threads légers (std::thread) ; conteneurs et algorithmes de concurrence Boost sécurisés pour les threads ; OpenMP pour les multiprocesseurs à mémoire partagée ; bibliothèque d'opérations d'interaction simultanée C++ multiplateforme ; (cpp-Concur).

Sur le marché primaire ces derniers temps, la piste la plus en vogue est sans aucun doute l'IA, suivie du BTC. 80 % des projets discutés chaque jour sont concentrés dans ces deux pistes, au maximum, je peux parler de 5 ou 6 projets d'IA par jour. Il est prévisible que la bulle de l'IA atteindra son apogée l'année prochaine. Avec la mise en ligne de centaines de nouveaux projets d'IA, la valeur marchande de la piste IA atteindra son apogée lorsque la bulle éclatera enfin. est perdu, une véritable industrie va naître. La licorne qui trouve le point d'adaptation d'AIXCrypto continuera à faire avancer cette piste et l'ensemble de l'industrie. Ainsi, dans l'environnement surchauffé actuel de l'IA, nous devons nous calmer et examiner les changements qui ont eu lieu au niveau Infra ces derniers mois, en particulier dans la piste Infra de la chaîne publique. Certaines des nouveautés méritent d'être mentionnées. 1.ET

Les méthodes d'optimisation des performances du programme comprennent : Optimisation de l'algorithme : choisissez un algorithme avec une complexité temporelle moindre et réduisez les boucles et les instructions conditionnelles. Sélection de structure de données : sélectionnez les structures de données appropriées en fonction des modèles d'accès aux données, telles que les arbres de recherche et les tables de hachage. Optimisation de la mémoire : évitez de créer des objets inutiles, libérez la mémoire qui n'est plus utilisée et utilisez la technologie des pools de mémoire. Optimisation des threads : identifiez les tâches pouvant être parallélisées et optimisez le mécanisme de synchronisation des threads. Optimisation de la base de données : créez des index pour accélérer la récupération des données, optimisez les instructions de requête et utilisez des bases de données en cache ou NoSQL pour améliorer les performances.
