GoLang,把资源放回频道挂我的节目

GoLang,把资源放回频道挂我的节目,go,Go,执行此操作时,我的代码挂起“mr.registerChannel在go中,如果没有缓冲,则可以使用通道进行同步。这里,负责消费mr.registerChannel的进程正在尝试写入它。当您从或写入和取消缓冲通道时,您将等待,直到另一端有另一个进程分别向通道写入或从通道读取 因此,当该块尝试写入通道时,它会阻止等待某人读取它所写入的内容。由于此块还负责读取,因此它将在死锁中永远等待自己。您需要重新设计它,以便将字符串交还给其他对象读取,或者您需要使用缓冲通道,不要期望在go中的读取行worker_

执行此操作时,我的代码挂起
“mr.registerChannel在go中,如果没有缓冲,则可以使用通道进行同步。这里,负责消费
mr.registerChannel
的进程正在尝试写入它。当您从或写入和取消缓冲通道时,您将等待,直到另一端有另一个进程分别向通道写入或从通道读取


因此,当该块尝试写入通道时,它会阻止等待某人读取它所写入的内容。由于此块还负责读取,因此它将在死锁中永远等待自己。您需要重新设计它,以便将字符串交还给其他对象读取,或者您需要使用缓冲通道,不要期望在go中的读取行
worker_str=上出现陷阱,如果通道没有缓冲,则可以使用它们进行同步。这里,负责消费
mr.registerChannel
的进程正在尝试写入它。当您从或写入和取消缓冲通道时,您将等待,直到另一端有另一个进程分别向通道写入或从通道读取


因此,当该块尝试写入通道时,它会阻止等待某人读取它所写入的内容。由于此块还负责读取,因此它将在死锁中永远等待自己。您需要重新设计它,以便将字符串交还给其他对象读取,或者需要使用缓冲通道,不要期望在读取行上出现陷阱
worker\u str=是的,这很有用。我现在使用缓冲通道解决了这个问题。谢谢coco。根据经验,在添加缓冲之前解决死锁问题是个好主意。通常,添加缓冲只会推迟死锁问题;了解发生了什么并修复原因而不是求助于缓冲是一个好主意。然而,缓冲有时可以大大提高性能。因此,最好从性能调整的角度考虑缓冲,而不是纠正错误行为。是的,这很有帮助。我现在使用缓冲通道解决了这个问题。谢谢coco。根据经验,在添加缓冲之前解决死锁问题是个好主意。通常,添加缓冲只会推迟死锁问题;了解发生了什么并修复原因而不是求助于缓冲是一个好主意。然而,缓冲有时可以大大提高性能。因此,最好从性能调优的角度考虑缓冲,而不是纠正错误行为。
  for i := 0; i < mr.nMap; i++ {
    DPrintf("worker number is %d\n", mr.workerNumber)

    worker_str = <- mr.registerChannel

    DPrintf("Worker_str is %s \n",worker_str)

    args := &DoJobArgs{mr.file,"Map",i,mr.nReduce}
    var reply DoJobReply
    var ret bool
    ret = call(worker_str, "Worker.DoJob", args, &reply)
    if ret  {
        fmt.Println("wk worker done.\n")
      fmt.Println(worker_str)
      mr.registerChannel <- worker_str   // <=======stuck here
    } else
    {
      fmt.Println("wk worker fail.\n")
    }

    DPrintf("map finished.")

  }
type MapReduce struct {
    nMap            int    // Number of Map jobs
    nReduce         int    // Number of Reduce jobs
    file            string // Name of input file
    MasterAddress   string
    registerChannel chan string
    DoneChannel     chan bool
    alive           bool
    l               net.Listener
    stats           *list.List

    // Map of registered workers that you need to keep up to date
    Workers map[string]*WorkerInfo

    // add any additional state here
    workerNumber    int
}