ARTS-S golangゴルーチンとチャネル(一)

まずgolangでファイルがclock1.goという名前と仮定して、簡単なTCPサーバーを実装

// clock1.go
package main

import (
    "fmt"
    "io"
    "net"
    "time"
)

func handleConn(c net.Conn) {
    defer c.Close()
    for {
        n, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
        fmt.Println(n)
        if err != nil {
            return
        }
        time.Sleep(1 * time.Second)
    }
}

func main() {
    listen, err := net.Listen("tcp", "localhost:8080")
    if err != nil {
        fmt.Println(err)
    }
    for {
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println(err)
            continue
        }
        handleConn(conn)
    }
}

コンパイルして実行するには、次のコマンドを使用します

go build -o clock1
./clock1

これは、MacやLinuxで実行されます

nc locahost 8080

LinuxでツールNCである。.clock1は、要求を受信した後TCPクライアントに対応するクライアントに現在時刻を出力する。
CLOCK1現在時刻を表示することができるが、しかし8080 locahost NCプロセスが実行されているという問題があります、その後、ターミナルを開いて、その後、実行は立ち往生されます.clock1 NC locahost 8080は、シングルスレッドの入力端子であり
、以下のgoroutinesqすることでこの問題を解決し、唯一のクライアントの要求を処理します。CLOCK2。

//clock2.go
package main

import (
    "fmt"
    "io"
    "net"
    "time"
)

func handleConn(c net.Conn)  {
    defer c.Close()
    for {
        _, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
        if err != nil {
            fmt.Printf("write error %v", err)
            break
        }
        time.Sleep(1 * time.Second)
    }
}
func main() {
    listen, err := net.Listen("tcp", "localhost:8080")
    if err != nil {
        fmt.Println(err)
        return
    }
    for {
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println(err)
            continue
        }
        go handleConn(conn)
    }
}

clock1.goとclock2.go違いがhandleConn 1人の以上行く、新しいコルーチンを開始するのと同等のclock2.goである。ここで差が唯一の最も基本的な内容はもちろんのこと、綿密なディスカッションスレッドと支援ではありません。
まずスレッドですスレッドとコルーチンが非同期プログラミングに対処するためになされるようにプログラマを、簡単に理解することができるオペレーティングシステムの実装、コルーチンは、関数の独自の実装をgolang、スレッドに基づいて、動作によって糸
アソシエーションを実装するためのシステムチェンは、プログラミング言語によって実現しました。

おすすめ

転載: www.cnblogs.com/zhouyang209117/p/11610105.html