如何实现对无缓冲通道的非阻塞写入?

2024-02-09

From 有效的行动 https://golang.org/doc/effective_go.html#channels

接收器总是阻塞,直到有数据要接收。如果通道未缓冲,则发送方会阻塞,直到接收方收到该值。

But 信号.通知 https://golang.org/pkg/os/signal/#Notify将信号中继到无缓冲的通道而不阻塞。这是如何工作的以及是否可以与其他 chan


它说的是什么意思os.Notify不会阻塞,如果阻塞,消息将被丢弃。因此,虽然它确实不会阻塞,但如果不能立即接收到信号,它就不会中继信号。这是通过简单完成的select:

select {
    case channel <- message:
        // message sent
    default:
        // message dropped
}

这就是为什么文档Notify明确指出您应该使用缓冲通道。另请注意,缓冲通道也可能会阻塞,而不仅仅是无缓冲通道;缓冲通道仅在缓冲区已满时才会阻塞。

select被覆盖在the tour https://tour.golang.org/concurrency/5 and the spec https://golang.org/ref/spec#Select_statements.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现对无缓冲通道的非阻塞写入? 的相关文章

随机推荐

  • JSON.stringify(response.json()) 和 response.text() 之间的区别

    将响应流转换为 JSON 后 两者是否完全相同 const responseA fetch endpointReturnsJson const textA await responseA text 在平行宇宙里 const response
  • 我们可以在 SVG 模板中渲染 Angular 组件吗?

    看到我们可以将模板文件另存为 svg而不是 html现在我想我可以制作 svg 组件 可以按如下方式使用 main component svg
  • Rails + Compass:与直接使用 haml + blueprint 相比的优势

    我有一些在 Rails 项目上使用 haml sass 的经验 我最近开始将它们与 blueprintcss 一起使用 我所做的唯一一件事是将 blueprint css 转换为 sass 文件 并从那里开始编码 我什至有一个轨道发电机 h
  • 事后实现接口

    我认为 以下内容无法在 Java 中完成 但我很乐意学习如何实现类似的东西 假设我们有一个类 C 它已在编译代码中使用 我们既不能更改该代码 也不能更改 C 的原始定义 进一步假设有一些有趣的代码可以重用 只要 C 实现接口 I 即可 事实
  • 如何获取 Android 设备内部下载文件夹路径? [复制]

    这个问题在这里已经有答案了 是否可以获取Android设备内部下载文件夹路径 如果设备有 SD 卡 您可以使用 Environment getExternalStorageState 如果您没有 SD 卡 您可以使用 Environment
  • PInvoke 返回带有二维数组的结构

    我有定义在的结构c questions tagged c 2b 2bWin32 DLL 如下所示 typedef struct matrix double data int m int n Matrix 并且有一个函数 Matrix get
  • 尝试运行 TensorFlow 时 CUDNN_STATUS_NOT_INITIALIZED

    我已经在带有 Cuda 9 0 和 CuDNN 7 0 5 以及普通 Python 2 7 的 Ubuntu 16 04 上安装了 TensorFlow 1 7 尽管它们的 CUDA 和 CuDNN 示例都运行良好 并且 TensorFlo
  • 如何在C++中输出欧元符号

    我试图为一个计算出租车费用的程序输出一个 Eurosign 然后将其转换为美元或欧元 规范的一部分是我必须输出 Eurosign 我已经尝试过 Unicode 但我没有任何运气 任何帮助将不胜感激 谢谢 这是我的代码 void produc
  • Visual Studio 2012“扩展和更新”“无法连接到远程服务器”

    不幸的是 过去几个月的情况就是如此 我无法安装新的或更新的软件包工具 gt 扩展和更新我尝试了一切 但无法找到原因 我试过了 访问 NuGet 并从 下载包 包管理器控制台 安装包 SUCCESS 使用 Web 浏览器访问存储库 Visua
  • Boost asio,单个 TCP 服务器,多个客户端

    我正在创建一个 TCP 服务器 它将使用 boost asio 它将接受来自许多客户端的连接 接收数据并发送确认 问题是我希望能够接受所有客户 但我一次只想与一个客户合作 我希望所有其他事务都保留在队列中 Example 客户端1连接 客户
  • 使用 spring-data-jpa 自定义 ItemReader

    我正在使用现有实体和存储库创建一个 Spring 批处理项目 我需要使用自定义ItemReader用于使用现有 jpa 存储库读取数据的作业 定制阅读器 public class InMemoryReader implements Item
  • 在 INSERT 之后使用 OUTPUT 将标识列的值获取到(非表值)变量中

    给出以下简单的测试表 CREATE TABLE dbo Test Id bigint IDENTITY 1 1 NOT NULL Name varchar 50 NULL 我想在之后将标识列的值放入标量变量中INSERT使用OUTPUT条款
  • 使用 $dialog 多次打开同一个对话框

    我创建这个 plnkr http plnkr co edit fdAdDNU9adtYrY9smQvU p preview在回答这个问题时 AngularJS 在对话框中打开控制器 动态加载模板 https stackoverflow co
  • Android 中已弃用 URLEncodedUtils

    URLEncodedUtils在 Android API 22 中已弃用 我可以在这段代码中使用什么来代替 我需要改变URLEncode Utils Format line public String construct return if
  • Winapi :: 获取可用句柄数

    我想创建长时间运行我的程序的测试 并不时输出可用句柄的计数 我怎样才能用一些 WINAPI 函数来做到这一点 这是一篇关于如何调试句柄泄漏的好文章http blogs technet com b yongrhee archive 2011
  • 将 Base64 jpeg 图像传递给 og:image

    我的网站上有在运行时生成的图像 我使用 html 将其显示 img src 现在 我希望 Facebook 获取此图像 但如果我对 og image 元标记执行相同操作 Facebook 调试器会给我一个错误 有什么解决办法吗 当然 我想避
  • 将一系列值映射到另一个值

    我正在尝试找到一种有效的方法将一系列值映射到另一个值 例如 1 9 gt 49 10 24 gt 54 25 49 gt 59 50 74 gt 50 75 99 gt 49 100 150 gt 40 这里的值不遵循任何常规模式 一种解决
  • 由于其保护级别,文本框无法访问[重复]

    这个问题在这里已经有答案了 课堂作业要求我们创建一份简单的能源账单 第一天生成一个 ID 号 我想将其复制到第二个表格 但我不断收到以下信息 错误 CS0122 Form1 idgen 由于其保护级别而无法访问由于我将引用第一种形式中的许多
  • build.gradle 错误:无法创建tastk ':generateLockfiles'。 Flutter项目中但App运行正常

    我的 Flutter 项目中的 build gradle 文件 android build gradle 有错误 该应用程序运行完全正常 但这个错误对我来说仍然不太好 有人遇到过这个问题 错误吗 这是我完整的 build gradle 文件
  • 如何实现对无缓冲通道的非阻塞写入?

    From 有效的行动 https golang org doc effective go html channels 接收器总是阻塞 直到有数据要接收 如果通道未缓冲 则发送方会阻塞 直到接收方收到该值 But 信号 通知 https go