This TIP困惑了我.似乎是说 – 缓冲线使输入缓冲区无限大,当我认为线缓冲只影响输出的冲洗?我不能使用-buffersize 5000和-buffering line来保护我免受发送长队的人的影响吗?如果可以的话,陈有什么好处待定?要发现缓冲区何时没有换行符?
或者有两种不同的缓冲区?一个只是预读数据以节省时间,一个内部命令如获取和读取使用?
编辑:或者只是当你使用获取时才创建问题,因为它不返回部分行?是否会将流放入无限大缓冲区模式,否则如果缓冲区填满而没有换行符,则get永远不会返回它?这是TIP谈到的“线路缓冲模式”吗?
最佳答案 首先,-buffersize选项用于输出,而不是输入.我在过去的几年里从未需要设置它; Tcl的缓冲管理非常好.
其次,-buffering选项也用于输出.
第三,如果你使用阻塞频道,你很容易被某人发送给你很长的路线.除了等待行尾(或文件末尾)之外,你没有机会做任何其他事情.
但在非阻塞模式下,事情更加微妙.你得到一个可读的文件转换器(与文件无关,但是你可以更容易地检查它们的大小是否合理,并且在任何情况下它们通常都不是问题)并且获取$theChannel行,返回-1 . (如果为0或更多,则表示您已完整.)
那么-1是什么意思呢?嗯,这意味着该行不完整或者您已到达流的末尾.您可以使用fblocked / chan阻止(或eof来检测相反的情况)区分这些情况,并且您发现该行尚未存在.现在怎么办?检查Chan挂起输入缓冲了多少数据;如果有一个愚蠢的数量(“傻”是可调的)那么它是时候放弃通道,因为另一方不好(即,只是关闭它).
我还没有看到chan挂起输出真正用于对可写文件事件不满意,但它通常不是一个大问题:只使用fcopy / chan复制将数据从大型源假脱机到(慢)输出通道工作很好没有腹胀缓冲很多.