"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إيقاف تشغيل خادم Go TCP بشكل أنيق ومقاطعة Goroutine `(*TCPListener) Accept`؟

كيفية إيقاف تشغيل خادم Go TCP بشكل أنيق ومقاطعة Goroutine `(*TCPListener) Accept`؟

تم النشر بتاريخ 2024-11-12
تصفح:120

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

مقاطعة تنفيذ روتين Go (*TCPListener) قبول

أثناء إنشاء خادم TCP في Go، قد تواجه تحديًا بأمان إيقاف تشغيل الخادم ومقاطعة وظيفة معالجة goroutine (*TCPListener) قبول.

في Go، func (*TCPListener) قبول تنفيذ الكتل حتى يتم تلقي الاتصال. لمقاطعة هذا goroutine، يجب عليك:

إغلاق الشبكة. المستمع:

مفتاح مقاطعة goroutine القبول هو إغلاق الشبكة.المستمع تم الحصول عليه من net. يستمع(...). من خلال إغلاق المستمع، فإنك تشير إلى نظام التشغيل بأنه لن يتم استقبال المزيد من الاتصالات، مما يتسبب في خروج قبول goroutine.

العودة من Goroutine:

بعد الإغلاق أيها المستمع، تأكد من عودة goroutine الخاص بك. إذا كان goroutine يحتوي على رمز يتبع استدعاء القبول، فسوف يستمر في التنفيذ وقد يتسبب في سلوك أو أخطاء غير مقصودة.

مثال على الكود:

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
}
يقوم هذا الرمز بإنشاء TCPListener على المنفذ 8080 ويقوم بتشغيل goroutine الذي يتعامل مع الاتصالات الواردة في حلقة لا نهائية. عندما يضغط المستخدم على زر الإدخال، يغلق البرنامج المستمع ويقاطع مكالمة قبول الحظر، مما يتسبب في عودة goroutine.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3