Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Teruskan membaca data selepas berhenti seketika

Teruskan membaca data selepas berhenti seketika

WBOY
WBOYke hadapan
2024-02-11 08:27:08379semak imbas

Teruskan membaca data selepas berhenti seketika

editor php Banana ada di sini untuk berkongsi dengan anda helah menarik - "teruskan membaca data selepas berhenti seketika". Dalam pengaturcaraan, kadangkala kita perlu menunggu untuk tempoh masa sebelum meneruskan operasi seterusnya, dan teknik ini boleh membantu kita mencapai matlamat ini. Sama ada ia digunakan untuk operasi tertunda permintaan rangkaian, atau untuk mengelakkan operasi memakan masa tertentu daripada menjejaskan kecekapan pelaksanaan program, teknik ini boleh memainkan peranan penting. Di bawah, kami akan memperkenalkan secara terperinci bagaimana untuk melaksanakan fungsi ini dalam php.

Kandungan soalan

Saya menggunakan curl untuk mendapatkan data dari titik akhir dan memindahkannya ke program saya. Fungsi utama program membaca data seperti ini

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)

Semuanya baik sehingga ke tahap ini. Walau bagaimanapun, matlamat akhir saya adalah untuk berulang kali melencongkan titik akhir seperti ini untuk tempoh masa supaya program membaca gumpalan N JSON yang tiba pada selang masa N.

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

Data berstruktur yang sama akan dicapai selepas setiap lencong ke titik akhir. Jadi saya perlu mengalihkan kod bacaan data ke fungsi readStdIn 中,我将重复调用该函数,直到curl 停止发送数据,并且每次我的程序接收到 json 数据时,我都会将其解组到结构中并将其添加到切片中。为了重复调用 readStdIn,我使用了 for 循环,为了读取 readStdIn 中的数据,我也使用了 for 循环。 readStdIn Fungsi tidak pernah selesai. kenapa tidak

Fungsi utama

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
 }

}

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

Penyelesaian

untuk menghuraikan JSON

Anda juga boleh menggunakan pengimbas dengan menyesuaikan fungsi atau menukar skrip bash. Tetapi saya percaya kedua-duanya lebih kompleks daripada kod di bawah.

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

Untuk data diasingkan baris baharu

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

Ia berfungsi untuk mencipta kejadian program baharu (seperti contoh anda) dan penggunaan paip biasa.

Guna saluran paip yang sama

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

repeatedDateEcho | ./myprogram
</code>

Keluaran:

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

Gunakan saluran paip yang berbeza (contoh baharu setiap kali)

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

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

Atas ialah kandungan terperinci Teruskan membaca data selepas berhenti seketika. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam