Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-11 08:27:08423parcourir

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)

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

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
 }

}

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)
}

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>
<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>

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>

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>

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer