我的流程是这样的:
从文件hash.log中读取infohash到一个map[string]int变量hashlist中,读取格式为:hashlist["infohash值"]=1,infohash是有重复值的,在读取的时候,如果遇到重复值,hashlist["infohash"]的值就会自动加1,就编程了hashlist["infohash"]=2,如果没有重复值,则默认为1
当全部读取完成后,使用range来处理map变量,将其中的每一条infohash写入数据库,使用go来并发处理,但是实际操作时却发现,虽然map变量中没有重复值,但实际操作时,却发现循环一旦开始,每次都只会重复一条数据
我的代码如下:
```go
for {
//e := os.Chdir("/tmp/torrent/")
e := os.Chdir(path + "torrent/")
if e != nil {
//os.Mkdir("/tmp/torrent/", 0)
os.Mkdir(path+"torrent/", 0)
}
s := time.Now().Format("20060102")
f, err := os.Open(path + "hash/" + s + ".log")
if err != nil {
continue
}
defer f.Close()
var hashList = make(map[string]int)
bf := bufio.NewReader(f)
for {
line, isPrefix, err := bf.ReadLine()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
if isPrefix {
fmt.Println("Line too long")
}
if _, ok := hashList[string(line)]; ok {
hashList[string(line)]++
} else {
hashList[string(line)] = 1
}
}
ch := make([]chan int, 128)
no := 0
var lis = make(map[string]int)
for k, v := range hashList {
_, ok := lis[k]
if ok {
continue
}
if len(lis) >= 128 {
lis = make(map[string]int)
}
lis[k] = v
if no >= 128 {
popChan(ch)
no = 0
}
ch[no] = make(chan int)
go func(chx chan int, nox int) {
fmt.Println(k)
n, err := pullTorrent(k, v)
if n != 0 {
if err != nil {
fmt.Println(err)
}
}
chx <- nox
}(ch[no], no)
no++
}
time.Sleep(10 * time.Second)
}
```
比如我的文件中有:
```aaaa
bbbb
cccc
cccc```
这样的几条infohash,读取后,循环开始,第一次执行就会全部都是cccc,请问要怎么处理?
有疑问加站长微信联系(非本文作者)