- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
为什么像下面这样的 GO 例程在使用缓冲 channel 时以随机顺序输出字节序列?
这是复制错误行为的代码,其中 data.csv
是一个简单的 CSV 文件,包含 1000 行随机数据(每行大约 100 字节)加上标题行(总共 1001 行) ).
package main
import (
"bufio"
"os"
"time"
)
func main() {
var channelLength = 10000
var channel = make(chan []byte, channelLength)
go func() {
for c := range channel {
println(string(c))
}
}()
file, _ := os.Open("./data.csv")
scanner := bufio.NewScanner(file)
for scanner.Scan() {
channel <- scanner.Bytes()
}
<-time.After(time.Second * time.Duration(3600))
}
以下是输出的前 6 行,作为我所说的“损坏的输出”的示例:
979,C
tharine,Vero,cveror6@blinklist.com,Female,133.153.12.53
980,Mauriz
a,Ilett,milettr7@theguardian.com,Female,226.123.252.118
981
Sher,De Laci,sdelacir8@nps.gov,Female,137.207.30.217
[...]
另一方面,如果 channelLength = 0,则代码运行平稳,因此使用无缓冲 channel (同样是前 6 行):
id,first_name,last_name,email,gender,ip_address
1,Hebert,Edgecumbe,hedgecumbe0@apple.com,Male,108.84.217.38
2,Minor,Lakes,mlakes1@marriott.com,Male,231.185.189.39
3,Faye,Spurdens,fspurdens2@oakley.com,Female,80.173.161.81
4,Kris,Proppers,kproppers3@gmpg.org,Male,10.80.182.51
5,Bronnie,Branchet,bbranchet4@squarespace.com,Male,118.117.0.5
[...]
数据是随机生成的。
最佳答案
来自buffer.Scanner
文档:
The underlying array may point to data that will be overwritten by a subsequent call to Scan
围绕通过 channel 传递的 slice 的使用存在数据竞争。您需要复制您发送的数据。在此示例中,通过使用 string
而不是 []byte
并调用 scanner.Text
最容易实现。
关于go - GO 例程中缓冲 channel 范围的输出中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53752527/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!