V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
arcaitan
V2EX  ›  问与答

想问一个 go 的技术问题

  •  
  •   arcaitan · 2020-04-09 11:08:01 +08:00 · 2174 次点击
    这是一个创建于 1724 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在做 6.824 的 lab2A,现在有个问题我搞了几天,一直没找到原因
    下面这个方法,
    执行的时候打印出了 line1 处的 DPrintf("follower rf %v voted for other!\n", rf.me),
    然后就卡住了,永远也打印不出 line2 的("-------------------------------rf %v ----for step %v end!!! \n\n\n", rf.me, i)
    有人有思路么?理论上,如果我已经走到了 line1,下一步不就是跳到 switch 语句外面的 line2 了么?

    go func() {
    i:=0
    for {
    i++
    fmt.Printf("----------------------------------------------------------------rf %v ----for step %v start\n", rf.me, i)
    //...
    switch state {
    case FOLLOWER:
    rf.resetElectionTimer()
    select{
    case <- rf.heartBeatCh:
    DPrintf("follower rf %v heartbeat for other!\n", rf.me)
    rf.stopElectionTimer()

    case <- rf.voteCh:
    rf.stopElectionTimer()
    DPrintf("follower rf %v voted for other!\n", rf.me) //line1

    case <- rf.electionTimer.C:
    DPrintf("follower rf %v timeout change to candidate\n", rf.me)
    rf.changeState(CANDIDATE, term)
    //rf.resetElectionTimer()

    }
    case CANDIDATE:
    //...

    }
    case LEADER:
    //...
    }
    //line2
    fmt.Printf("-------------------------------rf %v ----for step %v end!!! \n\n\n", rf.me, i)
    }
    }()
    第 1 条附言  ·  2020-04-09 14:12:32 +08:00
    搞定了,please ignore
    不是我问题描述里的问题,是因为在 switch 里用了 resettimer,导致了之后卡在 select 里
    8 条回复    2020-04-09 14:33:06 +08:00
    linauror
        1
    linauror  
       2020-04-09 11:14:42 +08:00
    DPrintf 怎么定义的,是不是打印后就结束程序了?
    arcaitan
        2
    arcaitan  
    OP
       2020-04-09 11:15:39 +08:00
    @linauror 不是,就是个带了开关的 log 打印

    // Debugging
    const Debug = 1

    func DPrintf(format string, a ...interface{}) (n int, err error) {
    if Debug > 0 {
    log.Printf(format, a...)
    }
    return
    }
    zjh31415926
        3
    zjh31415926  
       2020-04-09 11:53:41 +08:00
    哎,这代码也不好好格式化下,谁愿意琢磨啊
    hawken
        4
    hawken  
       2020-04-09 12:06:29 +08:00
    把代码放到 play.golang.org 里吧
    arcaitan
        5
    arcaitan  
    OP
       2020-04-09 13:08:45 +08:00
    @zjh31415926 不是,格式化好的,但是提交到 v2 之后就变成这样了,也没办法 edit
    arcaitan
        6
    arcaitan  
    OP
       2020-04-09 13:09:30 +08:00
    @hawken 真要跑起来依赖很多其他文件的
    Vegetable
        7
    Vegetable  
       2020-04-09 14:23:46 +08:00
    题外话, 用 markdown 语法,或者 github gist 都可以
    arcaitan
        8
    arcaitan  
    OP
       2020-04-09 14:33:06 +08:00
    @Vegetable 下次注意
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2523 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:35 · PVG 12:35 · LAX 20:35 · JFK 23:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.