Heim > Artikel > Backend-Entwicklung > Gehen Sie zur gleichzeitigen Programmierung: asynchrone Programmierung und nicht blockierende E/A
In Go stehen asynchrone Programmierung und nicht blockierende E/A für die gleichzeitige Programmierung zur Verfügung. Bei der asynchronen Programmierung werden leichtgewichtige Goroutinen verwendet, um Aufgaben im Hintergrund auszuführen, während das Hauptprogramm die Ausführung fortsetzt. Nicht blockierendes IO verwendet die io.Reader-Schnittstelle, um Ein-/Ausgabevorgänge auszuführen, ohne auf den Abschluss warten zu müssen. Diese beiden Konzepte können in realen Anwendungen wie der effizienten Verarbeitung von Webanfragen verwendet werden.
In der Go-Sprache sind asynchrone Programmierung und nicht blockierende IO Schlüsselkonzepte der gleichzeitigen Programmierung. Dieser Artikel befasst sich mit beiden Konzepten und demonstriert ihre praktische Anwendung anhand praktischer Beispiele.
Asynchrone Programmierung ist ein Programmierstil, bei dem Ereignisse so behandelt werden, wie sie auftreten, anstatt auf ihren Abschluss zu warten. In der Go-Sprache wird die asynchrone Programmierung hauptsächlich durch Goroutine implementiert. Goroutine ist ein leichter Thread in der Go-Sprache, der Aufgaben gleichzeitig im Hintergrund ausführen kann.
func main() { ch := make(chan string) // 启动一个Goroutine go func() { time.Sleep(1 * time.Second) ch <- "Hello, world!" }() // 主程序从通道中读取数据。如果数据尚未准备好,该行代码将阻塞 result := <-ch fmt.Println(result) // 输出:"Hello, world!" }
Im obigen Beispiel startet das Hauptprogramm eine Goroutine, die im Hintergrund eine Aufgabe abarbeitet. Das Hauptprogramm muss nicht auf den Abschluss der Goroutine warten, bevor es mit der Ausführung fortfährt, und kann in dieser Zeit andere Aufgaben erledigen.
Nicht blockierende E/A ist eine Eingabe-/Ausgabeoperation, die die Programmausführung erst blockiert, wenn die Operation abgeschlossen ist. In der Go-Sprache wird nicht blockierendes IO normalerweise über die Schnittstelle io.Reader
implementiert. io.Reader
接口来实现。
import ( "bytes" "io" "log" ) func main() { // 创建一个Buffer作为io.Reader reader := bytes.NewBufferString("Hello, world!") // 创建一个缓冲区并从reader中读取数据 buf := make([]byte, 1024) n, err := reader.Read(buf) if err != nil { log.Fatal(err) } // 将读取到的数据转换成字符串 result := string(buf[:n]) fmt.Println(result) // 输出:"Hello, world!" }
在上面示例中,我们使用io.Reader
import ( "fmt" "log" "net/http" // 导入第三方包 "github.com/gorilla/mux" ) func main() { // 创建一个mux路由器 router := mux.NewRouter() // 使用Goroutine处理请求 router.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { time.Sleep(1 * time.Second) fmt.Fprintf(w, "Hello, world!") }) // 监听端口 log.Fatal(http.ListenAndServe(":8080", router)) }Im obigen Beispiel verwenden wir die Schnittstelle
io.Reader
, um Daten aus einem Puffer zu lesen. Lesevorgänge sind nicht blockierend, was bedeutet, dass das Hauptprogramm nicht blockiert, auch wenn die Daten noch nicht bereit sind. Praktische FälleAsynchrone Programmierung und nicht blockierende E/A werden in der Anwendungsentwicklung häufig verwendet. Ein häufiger Anwendungsfall ist die Bearbeitung von Webanfragen. rrreee
In diesem Beispiel haben wir einen Web-Router mit der Drittanbieter-Bibliothek Gorilla Mux erstellt. Wir verwenden Goroutine zur Verarbeitung von HTTP-Anfragen, sodass das Hauptprogramm mehrere Anfragen gleichzeitig bearbeiten kann. FazitAsynchrone Programmierung und nicht blockierende E/A sind zwei wichtige Konzepte bei der gleichzeitigen Programmierung in der Go-Sprache. Durch die gemeinsame Nutzung können wir leistungsstarke, reaktionsfähige Anwendungen erstellen. 🎜Das obige ist der detaillierte Inhalt vonGehen Sie zur gleichzeitigen Programmierung: asynchrone Programmierung und nicht blockierende E/A. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!