GithubHelp home page GithubHelp logo

对 broadcast.go 的 疑问 about link HOT 3 CLOSED

funny avatar funny commented on August 25, 2024
对 broadcast.go 的 疑问

from link.

Comments (3)

bg5sbk avatar bg5sbk commented on August 25, 2024

异步发送的代码是这样的:

func (session *Session) asyncSendBuffer(buffer *OutBuffer, timeout time.Duration) AsyncWork {
    c := make(chan error, 1)
    if session.IsClosed() {
        c <- SendToClosedError
    } else {
        select {
        case session.asyncSendBufferChan <- asyncBuffer{c, buffer}:
        default:
            if timeout == 0 {
                session.Close()
                c <- AsyncSendTimeoutError
            } else {
                go func() {
                    select {
                    case session.asyncSendBufferChan <- asyncBuffer{c, buffer}:
                    case <-session.closeChan:
                        c <- SendToClosedError
                    case <-time.After(timeout):
                        session.Close()
                        c <- AsyncSendTimeoutError
                    }
                }()
            }
        }
    }
    return AsyncWork{c}
}

这个设计的结果是:如果外部指定了timeout值为五秒,同时asyncSendBufferChan阻塞了,那么就会产生一个goroutine重新尝试发送,这个goroutine如果等待五秒还是发送不出去,就退出并返回错误。

因此在广播的时候,如果指定了timeout为五秒,也不会阻塞广播发送的过程,但是有可能短时间产生大量goroutine,所以建议广播的时候尽量不要给timeout值,如果要给也尽量不要太长,这样goroutine销毁比较快。

from link.

bg5sbk avatar bg5sbk commented on August 25, 2024

广播最好别自己Fetch发送,已经有内置的广播接口。

// Broadcast to sessions. The message only encoded once
// so the performance is better than send message one by one.
func (b *Broadcaster) Broadcast(message Message, timeout time.Duration) ([]BroadcastWork, error) {
    buffer := newOutBuffer()
    b.protocol.PrepareOutBuffer(buffer, message.OutBufferSize())
    if err := message.WriteOutBuffer(buffer); err != nil {
        buffer.free()
        return nil, err
    }
    buffer.isBroadcast = true
    works := make([]BroadcastWork, 0, 10)
    b.fetcher(func(session *Session) {
        buffer.broadcastUse()
        works = append(works, BroadcastWork{
            session,
            session.asyncSendBuffer(buffer, timeout),
        })
    })
    return works, nil
}

from link.

nodephp avatar nodephp commented on August 25, 2024

感谢达达 的解疑

from link.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.