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