Golang中国

x0601y

go 2 go

Golang China 第 1798 号会员,加入于 2014-08-14 21:51


x0601y最近创建的主题


弱弱的问一问,Go难道天生就不适合kafka,spark搭配?
问与答x0601y • 2016-06-25 23:23
11 使用mgo驱动,运用goroutine往mongodb中插入数据,开go程写竟然比串行写慢
问与答x0601y • 2016-05-13 12:38 • 最后回复来自 seefan
3 WaitGroup不能退出,一直阻塞,报出deadlock的错误
问与答x0601y • 2016-05-12 15:07 • 最后回复来自 renwairen
1 有了解NSQ的朋友吗?最近想了解下消息系统,本来想看看关于kafka相关的资料,后来一想golang处理并发这么强悍,不知道有没有相关的消息系统,然后就找到了NSQ,分布式实时消息系统。还没深看,想和大神们讨论下两者的区别
问与答x0601y • 2016-05-06 16:58 • 最后回复来自 chris
4 关于golang 匿名字段的问题,使用mgo驱动读取mongodb数据为空
问与答x0601y • 2016-04-21 15:39 • 最后回复来自 x0601y
10 坛子里有长沙的人呢,寻求组织
问与答x0601y • 2015-12-28 10:47 • 最后回复来自 wencan
4 极验验证 怎么样
问与答x0601y • 2015-10-27 23:10 • 最后回复来自 x0601y
4 mgo 批量插入的问题
问与答x0601y • 2015-04-28 00:17 • 最后回复来自 x0601y
3 树莓派中怎么编译golang,求大神支招
问与答x0601y • 2015-04-01 00:54 • 最后回复来自 x0601y
11 关于win下intellij idea 与gopath的问题
问与答x0601y • 2016-12-08 01:25 • 最后回复来自 wyclef
x0601y 创建的更多主题

x0601y最近回复了


回复了 longyunmeican 创建的主题: 【北京-美餐】『Web 开发工程师( Go 语言)』15-30 K 2017-02-11 01:13

要不要来北京呢,这是个问题

回复了 dxhdxh2k 创建的主题: 推荐一个比gin更快的webframework---iris 2016-10-29 00:37

@jimmykuu 能分享下选型的过程吗?我现在项目中用的是echo。因为看过一段时间的echo代码,命名也接近gin,但gin很久没更新了,而echo目前还算活跃,文档也还齐全,所以选择了echo。也看过beego,社区很完善了,但有些写法不太喜欢。

回复了 rod6 创建的主题: 继续寻找真心喜欢Go的兄弟加盟 2016-05-14 21:33

我看见用NSQ的了,哈哈

回复了 x0601y 创建的主题: 使用mgo驱动,运用goroutine往mongodb中插入数据,开go程写竟然比串行写慢 2016-05-12 21:36

@oywc410 你这个思路倒是给我了一个启示,我备注中也说过:insertAsync中不加锁会进入死锁状态,当时我不清楚具体原因。会不会是因为开太多goroutine引起死锁呢?但不是说只要内存不爆goroutine可以一直开下去吗,且@myml说过mgo内部是有线程安全的线程池的,照理说越多goroutine应该不会慢啊

回复了 x0601y 创建的主题: 使用mgo驱动,运用goroutine往mongodb中插入数据,开go程写竟然比串行写慢 2016-05-12 21:28

@renwairen 如果mgo内部有连接池,就算有锁我开多个goroutine也应该是可以并发插入的。

回复了 x0601y 创建的主题: 使用mgo驱动,运用goroutine往mongodb中插入数据,开go程写竟然比串行写慢 2016-05-12 21:23

@myml 如果是线程安全的,为什么我把insertAsync中的锁去掉后,插入3000多条记录就会进入死锁状态。
我试过几次,每次都进入死锁状态了。难道因为是5W次循环,开5W个goroutine导致进入死循环?但我也查过内存消耗啊,没有耗干净

回复了 jumpchess 创建的主题: 大家在实际项目中一般用什么IDE呢, 谢谢 2016-05-12 09:46

@newsyue vscode 导入包时,有快捷键吗?每次还有鼠标点一下,好别扭

回复了 sneermorn 创建的主题: ringbuffer的源码有一段看不太懂 求指教 2016-05-12 09:19

这是哪个Repo的ringbuffer?

回复了 x0601y 创建的主题: 使用mgo驱动,运用goroutine往mongodb中插入数据,开go程写竟然比串行写慢 2016-05-12 00:04

@seefan mgo底层有原生连接池吗?还是说得自己实现?

回复了 Spring_z 创建的主题: mgo 连接mongodb数据库求和应该怎么做 2016-05-11 12:25
package main

import (
    "fmt"
    "strconv"
    "sync"
    "time"

    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)


type T struct {
    B_id    string      `bson:"b_id"`
    B_limit int         `bson:"b_limit"`
    B_join  int         `bson:"b_join"`
    B_coins int         `bson:"b_coins"`
    B_free  int         `bson:"b_free"`
    B_map   interface{} `bson:"b_map"`
}

var session *mgo.Session
var c *mgo.Collection

func main() {
    session, err := mgo.Dial("localhost:27017")
    if err != nil {
        panic(err)
    }

    defer session.Close()
    c = session.DB("test").C("bag")
    var r interface{}
    c.Find(bson.M{"_id": bson.ObjectIdHex("5714c2b208d08749548b456f")}).One(&r)
    fmt.Println(r)
    fmt.Println("------------------------------------------------------------------")

    pipe()
    mapReduce()
    pipe()

}

func insertData() {

    var wg sync.WaitGroup
    for index := 0; index < 10000; index++ {
        wg.Add(1)
        go func(i int) {
            t := &T{B_id: "b" + strconv.Itoa(i), B_coins: i}
            c.Insert(t)
            wg.Done()
        }(index)
    }
    wg.Wait()

    //t := &T{B_id: "b" + strconv.Itoa(index), B_coins: index}
    //c.Insert(t)
    //}
    //wg.Wait()
    //time2 := time.Now()
    //fmt.Printf("cost time: %s", time2.Sub(time1))
    //count, _ := c.Find(bson.M{}).Count()
    //fmt.Println(count)

}

func pipe() {
    time1 := time.Now()
    pipe := c.Pipe([]bson.M{{"$group": bson.M{"_id": "allCoins", "value": bson.M{"$sum": "$b_coins"}}}})
    iter := pipe.Iter()
    var result []struct {
        Id    string `_id`
        Value int    `value`
    }
    iter.All(&result)
    time2 := time.Now()
    fmt.Printf("pipe cost %s  \n", time2.Sub(time1))
    fmt.Println(result)
}

func mapReduce() {

    time1 := time.Now()
    job := &mgo.MapReduce{
        Map:    "function() { emit('allCoins', this.b_coins) }",
        Reduce: "function(key, values) { return Array.sum(values) }",
    }

    var result []struct {
        Id    string `_id`
        Value int    `value`
    }
    c.Find(nil).MapReduce(job, &result)
    time2 := time.Now()
    fmt.Printf("mapreduce cost %s  \n", time2.Sub(time1))
    fmt.Println(result)
}

数据是你给的bag.json,我将其扩充到了70w+,输出结果如下:
pipe cost 11.7490453s
[{allCoins 74111520}]
mapreduce cost 5.1879028s
[{allCoins 74111520}]
pipe cost 1.1858444s
[{allCoins 74111520}]

x0601y 创建的更多回复