Maison > développement back-end > Golang > Continuer à lire les données après une pause d'une seconde

Continuer à lire les données après une pause d'une seconde

WBOY
Libérer: 2024-02-11 08:27:08
avant
461 Les gens l'ont consulté

Continuer à lire les données après une pause dune seconde

l'éditeur php Banana est là pour partager avec vous une astuce intéressante : "continuer à lire les données après une pause d'une seconde". En programmation, nous devons parfois attendre un certain temps avant de continuer à effectuer des opérations ultérieures, et cette technique peut nous aider à atteindre cet objectif. Qu'elle soit utilisée pour retarder les opérations des requêtes réseau, ou pour éviter que certaines opérations chronophages n'affectent l'efficacité d'exécution du programme, cette technique peut jouer un rôle important. Ci-dessous, nous présenterons en détail comment implémenter cette fonction en php.

Contenu de la question

J'utilise curl pour obtenir des données d'un point de terminaison et les transférer vers mon programme. La fonction principale du programme lit des données comme celle-ci

reader := bufio.NewReader(os.Stdin)
var buf bytes.Buffer
line, err := reader.ReadString(`\n`)
for {
  if err != nil{
     buf.WriteString(line)
     break
   }
  buf.WriteString(line)
}
var data Memstats
err = json.Unmarshal(buf.Bytes(), &data)
Copier après la connexion

Tout va bien jusqu’à présent. Cependant, mon objectif final est de boucler à plusieurs reprises le point de terminaison comme ceci pendant un certain temps afin que le programme lise N blobs JSON arrivant à N intervalles de temps.

for i in {1..10}; do curl localhost:6000/debug/vars | ./myprogram; sleep 1; done
Copier après la connexion

Les mêmes données structurées seront atteintes après chaque boucle vers le point final. Je dois donc déplacer le code de lecture des données vers une fonction readStdIn 中,我将重复调用该函数,直到curl 停止发送数据,并且每次我的程序接收到 json 数据时,我都会将其解组到结构中并将其添加到切片中。为了重复调用 readStdIn,我使用了 for 循环,为了读取 readStdIn 中的数据,我也使用了 for 循环。 readStdIn La fonction ne se termine jamais. pourquoi pas?

Fonctions principales

for{
 reader := bufio.NewReader(os.Stdin)
 h.readStdIn(reader)
 time.Sleep(1 * time.Second)
 var err error
 //check to see if curl sent more data,  if not I break out of main function and continue on with program and hopefully an array full of Memstats
 newbytes, err := reader.ReadByte()
 if err != nil{
   break
 }

}
Copier après la connexion

fonction readStdIn

func (rt *Graph)readStdIn(reader *bufio.Reader){
 var buf bytes.Buffer
 line, err := reader.ReadString('\n')
 for {
  if err != nil{
     if err == io.EOF{
        buf.WriteString(line)
        break
     }else{
       fmt.Println(err.Error())
       os.Exit(1)
     }
  }
 }
 buf.WriteString(line)
}
var data Memstats
err = json.Marshal(buf.Bytes(), &data)
rt.Memstats = append(rt.Memstats, &record)
}
Copier après la connexion

Solution de contournement

pour l'analyse de JSON

Vous pouvez également utiliser le scanner en personnalisant les fonctions ou en modifiant les scripts bash. Mais je pense que les deux sont plus complexes que le code ci-dessous.

<code>package main

import (
    "encoding/json"
    "errors"
    "fmt"
    "io"
    "os"
)

func main() {
    fmt.Println("Start")
    decoder := json.NewDecoder(os.Stdin)
    for {
        var u User
        err := decoder.Decode(&u)

        if errors.Is(err, io.EOF) {
            fmt.Println("End")
            break
        }

        if err != nil {
            fmt.Println("Can not decode into json", err)
            continue
        }

        fmt.Println(u)
    }
}

type User struct {
    UserId int    `json:"userId"`
    Id     int    `json:"id"`
    Title  string `json:"title"`
}
</code>
Copier après la connexion
<code>function repeatedCurl() {
  for i in $(seq 1 3); do
    # sleep 1 # optional you can emit
    curl -s "https://jsonplaceholder.typicode.com/posts/$i"
  done
}

repeatedCurl | ./foo
</code>
Copier après la connexion

Pour les données séparées par une nouvelle ligne

<code>package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    fmt.Println("Start")
    scanner := bufio.NewScanner(bufio.NewReader(os.Stdin))
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    fmt.Println("End")
}
</code>
Copier après la connexion

Cela fonctionne à la fois pour la création de nouvelles instances de programme (comme votre exemple) et pour l'utilisation normale des tuyaux.

Utilisez le même pipeline

<code>function repeatedDateEcho() {
  while sleep 1; do
   echo "$(date)"
  done
}

repeatedDateEcho | ./myprogram
</code>
Copier après la connexion

Sortie :

Start
Thu Jan 18 22:59:31 +03 2024
Thu Jan 18 22:59:32 +03 2024
Thu Jan 18 22:59:33 +03 2024
Thu Jan 18 22:59:34 +03 2024
Copier après la connexion

Utilisez différents pipelines (nouvelle instance à chaque fois)

while 睡眠 1;做 echo "$(date)" | ./我的程序;完成 Résultat :

Start
Thu Jan 18 22:58:46 +03 2024
End
Start
Thu Jan 18 22:58:47 +03 2024
End
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal