Comments (3)
异步发送的代码是这样的:
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.
广播最好别自己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.
感谢达达 的解疑
from link.
Related Issues (20)
- 请教解码 HOT 2
- session完全与net.Conn脱离关系了,应该继承net.Conn的 HOT 1
- 关于udp的实现 HOT 1
- tcp连接写,是否有必要加锁 HOT 1
- 为啥没有session start的callback? HOT 1
- tcp长链接,一个connection一个goroutine会不会太暴力 HOT 2
- 关于session的close HOT 1
- 问题 HOT 2
- readme文档示例代码没更新
- 当收到一个不合法的数据时,服务器就crash掉了 HOT 2
- Does this version have a benchmark performance test?
- Codec接口为什么要实现Send和Recive呢? HOT 2
- server 端出现疯狂 EOF错误
- Link
- Bitcoin wallet
- 如何获取对端地址 HOT 1
- 觉得项目不错,如果托管出去是不是会让这个项目更活跃。 HOT 2
- goroutine 21498 [IO wait] HOT 1
- net Temporary()函数已被弃用
- Hi HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from link.