>백엔드 개발 >Golang >Go: ResponseController의 기한이 준수되지 않음

Go: ResponseController의 기한이 준수되지 않음

王林
王林앞으로
2024-02-09 12:09:08836검색

Go:不遵守 ResponseController 的截止日期

php 에디터 스트로베리에서는 "Go: ResponseController 기한을 준수하지 않음"에 대해 소개하려고 합니다. 소프트웨어 개발에서 ResponseController는 응답 요청을 처리하는 데 사용되는 일반적인 컨트롤러입니다. 그러나 개발자가 코드를 작성할 때 ResponseController의 기한을 준수하지 않는 경우가 있어 일련의 문제가 발생할 수 있습니다. 이 기사에서는 이 문제를 자세히 살펴보고 코드의 신뢰성과 안정성을 보장하는 솔루션을 제공합니다.

질문 내용

쓰기에 시간이 너무 오래 걸릴 경우 클라이언트에 다시 쓰기를 취소하려고 하는 코드가 있습니다. 나는 setwritedeadline 메소드를 가지고 있기 때문에 이를 달성하기 위해 http.responsecontroller를 사용할 수 있다고 생각합니다.

안타깝게도 아래 코드에서 rw.write는 마감일이 지나도 오류를 반환하지 않습니다.

작성을 취소하는 다른 방법은 없나요?

으아악 으아악
package main

import (
    "log"
    "net/http"
    "time"
)

func main() {
    http.handlefunc("/", func(rw http.responsewriter, r *http.request) {
        log.println(r.method, r.url.path)

        rc := http.newresponsecontroller(rw)
        dl := time.now().add(3 * time.second)
        if err := rc.setwritedeadline(dl); err != nil {
            log.println(err)
            return
        }
        log.println("write deadline:", dl)

        var total int
        for _, b := range []byte("what!\n") {
            time.sleep(time.second)

            n, err := rw.write([]byte{b})
            if err != nil {
                log.println(err)
                return
            }

            total += n
            log.println("bytes written", n)
        }

        log.println(r.method, r.url.path, "write total", total)
    })

    http.listenandserve(":8080", nil)
}

해결 방법

setwritedeadline 문서 내용:

setwritedeadline 응답 작성 기한을 설정합니다. 기한이 지난 후 응답 본문을 작성하면 차단되지 않지만 데이터가 버퍼링된 경우 성공할 수 있습니다.

질문의 응답 작성자에 대한 쓰기는 애플리케이션에서 쓴 소량의 데이터가 버퍼링되어 있기 때문에 성공합니다.

컬의 "서버에서 빈 응답" 오류는 서버가 핸들러에서 반환될 때 기본 네트워크 연결에 대한 응답을 플러시할 때 기한이 준수됨을 나타냅니다.

클라이언트 속도 저하를 방지하려면 setwritedeadline을 사용하세요.

기한이 있는 컨텍스트 를 사용하여 서버가 응답을 생성하는 데 걸리는 시간을 제한하세요.

65bd46fc4 2월

위 내용은 Go: ResponseController의 기한이 준수되지 않음의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제