首頁  >  文章  >  後端開發  >  暫停一秒鐘後繼續讀取數據

暫停一秒鐘後繼續讀取數據

WBOY
WBOY轉載
2024-02-11 08:27:08423瀏覽

暫停一秒鐘後繼續讀取數據

php小編香蕉在這裡與大家分享一個有趣的技巧-「暫停一秒鐘後繼續讀取資料」。在程式設計中,有時候我們需要等待一段時間後再繼續執行後續的操作,而這個技巧可以幫助我們實現這個目標。無論是用於網路請求的延時操作,還是為了避免某些耗時的操作影響程式的執行效率,這個技巧都能發揮重要的作用。下面,我們將詳細介紹如何在php中實現這個功能。

問題內容

我正在使用curl從端點獲取資料並將其傳輸到程式中。程式的main函數讀取資料是這樣的

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)

到這裡為止一切正常。然而,我的最終目標是像這樣重複捲曲端點一段時間,以便程式讀取以 N 時間間隔到達的 N 個 JSON blob。

for i in {1..10}; do curl localhost:6000/debug/vars | ./myprogram; sleep 1; done

每次捲曲到端點後都會到達相同結構的資料。因此,我必須將數據讀取代碼移至函數readStdIn 中,我將重複調用該函數,直到curl 停止發送數據,並且每次我的程式接收到json 數據時,我都會將其解組到結構中並將其添加到切片中。為了重複呼叫 readStdIn,我使用了 for 循環,為了讀取 readStdIn 中的數據,我也使用了 for 迴圈。 readStdIn 函數永遠無法完成。為什麼不呢?

主要功能

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
 }

}

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

解決方法

用於解析 JSON

#您也可以透過自訂函數或更改 bash 腳本來使用掃描器。但我相信兩者都比下面的程式碼更複雜。

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

對於換行分隔資料

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

它適用於建立新的程式實例(如您的範例)和正常的管道使用。

使用相同的管道

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

repeatedDateEcho | ./myprogram
</code>

輸出:

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

使用不同的管道(每次都是新實例)

while 睡 1;做 echo "$(date)" | ./我的程式;完成 輸出:

Start
Thu Jan 18 22:58:46 +03 2024
End
Start
Thu Jan 18 22:58:47 +03 2024
End

以上是暫停一秒鐘後繼續讀取數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除