Go TCP 읽기를 차단할 수 있나요?

Barbara Streisand
풀어 주다: 2024-11-03 00:33:29
원래의
243명이 탐색했습니다.

Can Go TCP Reads Be Made Blocking?

Go TCP의 차단 및 비차단 읽기

Go에서 TCP 읽기는 기본적으로 비차단입니다. 이는 읽을 수 있는 데이터가 없더라도 conn.Read() 함수가 즉시 반환된다는 의미입니다. 이 동작은 클라이언트의 특정 응답을 기다리는 경우와 같은 특정 사용 사례에서 문제가 될 수 있습니다.

Go TCP 읽기가 차단될 수 있나요?

Go TCP 동안 읽기는 기본적으로 비차단이므로 차단하도록 설정할 수도 있습니다. 이는 sync.Mutex 유형을 사용하여 연결에 대한 액세스를 동기화함으로써 달성할 수 있습니다.

다음은 Mutex를 사용하여 읽기 작업을 차단하는 서버 코드의 수정된 버전입니다.

<code class="go">import (
    "fmt"
    "log"
    "net"
    "sync"
)

func main() {
    tcp := Init_tcp()
    conn, _ := tcp.Accept()
    data := make([]byte, 512)
    var m sync.Mutex

    for {
        m.Lock()
        conn.Read(data)
        m.Unlock()
        fmt.Println(data)
    }
}</code>
로그인 후 복사

이 예에서 sync.Mutex는 한 번에 하나의 고루틴만 연결에 액세스할 수 있도록 보장합니다. 이렇게 하면 연결에서 동시에 읽는 여러 고루틴으로 인해 데이터가 손상되는 것을 방지할 수 있습니다.

읽기 차단에 대한 대안

Mutex를 사용하면 TCP 읽기가 차단될 수 있지만 이는 이는 권장되는 접근 방식이 아니라는 점에 유의하는 것이 중요합니다. 작업을 차단하면 성능 문제와 교착 상태 상황이 발생할 수 있습니다. 대신 일반적으로 다음과 같은 대체 접근 방식을 사용하는 것이 좋습니다.

  • io.Reader 사용: io.Reader 인터페이스는 차단 읽기 작업을 제공합니다. io.Reader에서 TCP 연결을 래핑하면 차단 방식으로 연결에서 읽을 수 있습니다.
  • context.Context 사용: context.Context 유형을 사용하여 다음을 지정할 수 있습니다. 읽기 작업에 대한 시간 초과입니다. 시간 초과가 만료되면 읽기 작업은 오류를 반환합니다.
  • 고루틴 사용: 별도의 고루틴을 사용하여 TCP 연결에서 읽기를 처리할 수 있습니다. 이를 통해 차단 동작을 제어하고 메인 스레드 차단을 피할 수 있습니다.

결론

Go에서는 TCP 읽기를 차단하는 것이 가능하지만 권장되지 않습니다. 대신 io.Reader, context.Context 또는 goroutine과 같은 대체 접근 방식을 사용하여 차단 동작을 보다 효율적으로 처리하는 것이 좋습니다.

위 내용은 Go TCP 읽기를 차단할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿