gpt4 book ai didi

sockets - 使用 `chan pending output` 代替可写文件事件

转载 作者:行者123 更新时间:2023-12-03 11:54:16 25 4
gpt4 key购买 nike

哟,我用一个简单的协议(protocol)编写了​​一个服务器:客户端发送一条线路,服务器发送一条线路作为响应,重复。为了防止客户端通过发送大量行但不接受数据来填充 Tcl 的输出缓冲区,我可以检查 chan pending output而不是使用可写文件事件?

proc respond {stream msg} {
if {[chan pending output $stream] <= 1024} {
puts $stream $msg
} else {
#close $stream
}
}

最佳答案

对于输出, chan pending output 将正确描述在输出队列中等待的字节数。通常,该值将由 -buffersize 限制。你的值(value)chan configure (或 fconfigure )拥有它。

仅当 channel 非阻塞时才会超过该值;使用阻塞 channel ,当值越过它时,会阻塞写入底层设备(套接字、管道、文件、串行线等),所以当你看到它越过时,它又回到了再次限制。

但是如果你使用非阻塞 channel ,你真的应该使用 chan event (或 fileevent )。幸运的是,对于实际写入,Tcl 实际上会自动为您执行此操作;您可能希望从可写事件中获得的最有用的东西已经存在。在实践中,可写事件最常见的实际用途是检测异步套接字连接何时准备好服务。

所以你正在做的将工作,但你必须仔细考虑如果输出缓冲区“已满”该怎么办 ;消息可能需要延迟的想法是简单抽象容易泄漏的地方。使用 8.6 的协程,您可以(可能)执行透明挂起或类似的操作,但要正确处理此类事情可能需要花点心思。 (例如,GUI 客户端可能需要显示忙碌指示符并将事物置于用户无法输入更多请求的状态。)

关于sockets - 使用 `chan pending output` 代替可写文件事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19409431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com