ホームページ > バックエンド開発 > Golang > Go TCP サーバーを正常にシャットダウンし、「(*TCPListener) Accept」ゴルーチンを中断する方法は?

Go TCP サーバーを正常にシャットダウンし、「(*TCPListener) Accept」ゴルーチンを中断する方法は?

Patricia Arquette
リリース: 2024-11-03 07:27:02
オリジナル
812 人が閲覧しました

How to Gracefully Shut Down a Go TCP Server and Interrupt the `(*TCPListener) Accept` Goroutine?

Go ルーチンの実行を中断する (*TCPListener) Accept

Go で TCP サーバーを作成しているときに、正常に実行するという課題に遭遇する可能性があります。サーバーをシャットダウンし、ゴルーチン処理を中断します func (*TCPListener) Accept.

Go では、 func (*TCPListener) Accept は、接続が受信されるまで実行をブロックします。このゴルーチンを中断するには、次のようにする必要があります:

net.Listener を閉じる:

Accept ゴルーチンを中断する鍵は、net から取得した net.Listener を閉じることです。聞く(...)。リスナーを閉じることで、これ以上接続を受信しないことをオペレーティング システムに通知し、Accept ゴルーチンを終了させます。

Goroutine からのリターン:

終了後リスナーは、Goroutine が返すことを確認してください。ゴルーチンに Accept 呼び出しの後にコードがある場合、実行が継続され、意図しない動作やエラーが発生する可能性があります。

コード例:

<code class="go">package main

import (
    "fmt"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // Handle error
    }

    go func() {
        for {
            conn, err := ln.Accept()
            if err != nil {
                if err == net.ErrClosed {
                    return // Listener was closed
                }
                // Handle other errors
            }
            // Handle connection
            conn.Close()
        }
    }()

    fmt.Println("Press enter to stop...")
    var input string
    fmt.Scanln(&input)

    ln.Close() // Close the listener, interrupting the Accept loop
}</code>
ログイン後にコピー

このコードは、 TCPListener をポート 8080 で実行し、無限ループで受信接続を処理する goroutine を起動します。ユーザーが Enter キーを押すと、プログラムはリスナーを閉じ、ブロックしている Accept 呼び出しを中断し、ゴルーチンを返します。

以上がGo TCP サーバーを正常にシャットダウンし、「(*TCPListener) Accept」ゴルーチンを中断する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート