返回顶部
首页 > 资讯 > 后端开发 > GO >我不太了解 golang 通道
  • 627
分享到

我不太了解 golang 通道

2024-04-04 23:04:12 627人浏览 独家记忆
摘要

在golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《我不太了解 Golang 通道》,聊聊,希

golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《我不太了解 Golang 通道》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

goroutines 和 channel 这些天一直困扰着我。我正在 https://GitHub.com/adonovan/gopl.io/tree/master/ch9 查看 memo5 代码。 如果你看memo5的memo.go,有func (e *entry) call(f func, key string)func (e *entry) deliver(response chan<- result)部分。

// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: Https://creativecommons.org/licenses/by-nc-sa/4.0/

// See page 278.

// Package memo provides a concurrency-safe non-blocking memoization
// of a function.  Requests for different keys proceed in parallel.
// Concurrent requests for the same key block until the first completes.
// This implementation uses a monitor goroutine.
package memo

//!+Func

// Func is the type of the function to memoize.
type Func func(key string) (interface{}, error)

// A result is the result of calling a Func.
type result struct {
    value interface{}
    err   error
}

type entry struct {
    res   result
    ready chan struct{} // closed when res is ready
}

//!-Func

//!+get

// A request is a message requesting that the Func be applied to key.
type request struct {
    key      string
    response chan<- result // the client wants a single result
}

type Memo struct{ requests chan request }

// New returns a memoization of f.  Clients must subsequently call Close.
func New(f Func) *Memo {
    memo := &Memo{requests: make(chan request)}
    go memo.server(f)
    return memo
}

func (memo *Memo) Get(key string) (interface{}, error) {
    response := make(chan result)
    memo.requests <- request{key, response}
    res := <-response
    return res.value, res.err
}

func (memo *Memo) Close() { close(memo.requests) }

//!-get

//!+monitor

func (memo *Memo) server(f Func) {
    cache := make(map[string]*entry)
    for req := range memo.requests {
        e := cache[req.key]
        if e == nil {
            // This is the first request for this key.
            e = &entry{ready: make(chan struct{})}
            cache[req.key] = e
            go e.call(f, req.key) // call f(key)
        }
        go e.deliver(req.response)
    }
}

func (e *entry) call(f Func, key string) {
    // Evaluate the function.
    e.res.value, e.res.err = f(key)
    // Broadcast the ready condition.
    close(e.ready)
}

func (e *entry) deliver(response chan<- result) {
    // Wait for the ready condition.
    <-e.ready
    // Send the result to the client.
    response <- e.res
}

//!-monitor

我不明白 close(e.ready) <-e.ready 在这里如何同步。即使读完书,我还是不明白。请告诉我这个机制是什么。


正确答案


e.ready 更广为人知的名称是 done 通道。这是一种通过关闭 done (e.ready chan) 来告诉您的 ref 函数 domething 已准备就绪的方法。 <-e.ready 将阻塞,直到它的 done (lined)。

所以...阅读这段代码意味着下一步。

  1. deliver 等待红色信号。
  2. call 获取 e.res 的数据(e.res.value, e.res.err = f(key)`)
  3. call 通过关闭通道来释放已完成的通道 (close(e.ready))
  4. deliver 可以通过从 <-e.ready 读取块并将数据发送到 response

今天关于《我不太了解 golang 通道》的内容介绍就到此结束,如果有什么疑问或者建议,可以在编程网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

您可能感兴趣的文档:

--结束END--

本文标题: 我不太了解 golang 通道

本文链接: https://lsjlt.com/news/596045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 我不太了解 golang 通道
    在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《我不太了解 golang 通道》,聊聊,希...
    99+
    2024-04-04
  • golang 通道不关闭
    在Golang中,通道是一种非常有用的数据结构,可以在协程之间安全地传递数据。一个通道可以被关闭,以让接收方知道数据已经全部传递完毕。然而,在某些情况下,不关闭通道可能是更好的选择。首先,让我们看一下为什么关闭通道可能有帮助。当我们发送数据...
    99+
    2023-05-15
  • 不太掌握 goroutine 和通道,请分解这段代码
    偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《不太掌握 goroutine 和通道,请分解这段代码》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了...
    99+
    2024-04-05
  • Go range 解决通道死锁问题,我应该关闭通道吗?
    Golang不知道大家是否熟悉?今天我将给大家介绍《Go range 解决通道死锁问题,我应该关闭通道吗?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希...
    99+
    2024-04-05
  • vscode中开发golang太慢了如何解决
    这篇“vscode中开发golang太慢了如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vscode中开发golan...
    99+
    2023-07-06
  • Win10的版本太多了,用户不知道该怎么选
    不久前,微软正式公布了Win10各个版本的细节以及升级计划。Windows10将于今年夏季正式发布,微软将会提供Win10移动版、Win10家庭版、Win10专业版、Win10企业版、Win10教育版、Win10企业移动...
    99+
    2023-06-16
    Win10 版本太多 用户 版本
  • 通过对通道进行多次写入来理解 golang 阻塞通道行为
    php小编柚子在这篇文章中将向大家介绍如何通过对通道进行多次写入来理解 golang 阻塞通道的行为。在golang中,通道是一种用于在协程之间传递数据的重要机制。当通道已满时,写入操...
    99+
    2024-02-09
    golang开发
  • win10以太网不见了怎么解决
    这篇文章主要介绍“win10以太网不见了怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10以太网不见了怎么解决”文章能帮助大家解决问题。第一步:打开设备管理器,先选择网络适配器,然后选...
    99+
    2023-07-01
  • 缓冲通道的行为与我对 Go 的期望有何不同?
    在Go语言中,缓冲通道是一种特殊类型的通道,它与普通通道的行为有所不同。普通通道在发送数据时,发送者会被阻塞,直到有接收者接收数据为止。而缓冲通道则允许发送者在通道未满时继续发送数据,...
    99+
    2024-02-09
    go语言
  • 无论我关闭通道与否,地图缩小都不起效果
    大家好,今天本人给大家带来文章《无论我关闭通道与否,地图缩小都不起效果》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!问题内容这...
    99+
    2024-04-04
  • 对不起,不知道这些,我劝你还是别做软件测试员了!
    到今年,我从事软件测试行业,已经有七、八个春秋了,也算是一个资深的软件测试工程师,目前在上海一家500强企业任职软件测试架构师。我知道,在当今高速发展的信息社会,计算机和电子技术越来越受到人们的重视,以软件为代表的计算机行业正在以一种井喷式...
    99+
    2023-06-05
  • 我的电脑和我的文档打不开了如何解决
    如果您的电脑和文档无法打开,可以尝试以下解决方法:1. 重新启动电脑:有时候只需要重新启动电脑,就可以解决打不开的问题。2. 检查文...
    99+
    2023-09-05
    电脑
  • vscode中开发golang太慢了怎么办?怎么解决?
    近年来,Golang 作为一门初创公司都爱用的编程语言,越来越受到开发者们的关注。与此同时,也会因为种种原因出现一些问题导致开发效率降低。其中,有一种常见的情况就是使用 VSCode 编辑器时,Golang 开发环境因为过于慢而让人焦虑。接...
    99+
    2023-05-14
  • Golang控制通道实现协程等待详解
    目录前言方法一-睡眠等待方法二-通道什么是通道通道的特性什么是非缓冲通道什么是缓冲通道通道的简单使用非缓冲通道缓冲通道小心死锁使用通道实现协程等待前言 上一次简单了解了协程的工作原理...
    99+
    2022-11-21
    Golang通道实现协程等待 Go实现协程等待
  • 了解 Go 通道处理/缓冲区溢出
    珍惜时间,勤奋学习!今天给大家带来《了解 Go 通道处理/缓冲区溢出》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希...
    99+
    2024-04-05
  • mac系统太老升级不了如何解决
    若您的Mac系统过老无法进行升级,您可以尝试以下解决方法:1. 检查硬件兼容性:确保您的Mac硬件符合最新操作系统的最低要求。您可以...
    99+
    2023-09-04
    mac
  • win10开机太快进不了bios如何解决
    在Windows 10中,由于快速启动(Fast Startup)功能的增加,可能会导致开机过程太快,进入BIOS的时间非常短。如果...
    99+
    2023-09-05
    win10
  • linux文件太大删除不了如何解决
    如果Linux文件太大无法删除,您可以尝试以下方法解决问题:1. 使用rm命令删除文件:在终端中输入以下命令以删除文件:```rm ...
    99+
    2023-09-08
    linux
  • Android,你从入门到放弃了吗?程序员:你不知道我经历了什么!
    ...
    99+
    2023-06-04
  • golang函数通过管道传递参数的详解
    在 go 中,可以将函数作为参数通过管道传递,实现步骤如下:定义接收函数的 goroutine。在调用端 goroutine 中,创建管道并向其发送函数。 Go 中通过管道传递函数参数...
    99+
    2024-05-05
    管道 参数传递 golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作