私はフロートの多くの配列をストリームするサーバーを実装しています。オーディオプロセスが独立していなければならないチャンネルとゴルーチンを使ってGoウェブサーバーを構成する方法は?
- と入ってくるすべての要求がない場合でも、その仕事をする私の現在のアプローチまで待つことDataProcess関数を作る:私は次のことを達成するために、私のシステムを設計するためにいくつかの助けを必要としています。要求があります。
- チャンネルは1回のリクエストに対してのみデータを与えることができるので、2回以上のリクエストでDataProcessで準備したデータをどのように取得できますか?
- 実際にデータをストリームするには、リクエストハンドラはDataProcess全体が終了するのを待つことはできません。DataProcessの各繰り返しを完了するとすぐにハンドラデータを返すことができますか?
ご回答いただければ幸いです。これは私の現在の考えです:
package main
import (
"fmt"
"io"
"net/http"
"strconv"
"time"
)
func main() {
c := AudioProcess()
handleHello := makeHello(c)
http.HandleFunc("/", handleHello)
http.ListenAndServe(":8000", nil)
}
func makeHello(c chan string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
for item := range c { // this loop runs when channel c is closed
io.WriteString(w, item)
}
}
}
func AudioProcess() chan string {
c := make(chan string)
go func() {
for i := 0; i <= 10; i++ { // Iterate the audio file
c <- strconv.Itoa(i) // have my frame of samples, send to channel c
time.Sleep(time.Second)
fmt.Println("send ", i) // logging
}
close(c) // done processing, close channel c
}()
return c
}