channel关闭后立即返回false吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了channel关闭后立即返回false吗相关的知识,希望对你有一定的参考价值。

关闭不再需要使用的 channel 并不是必须的。跟其他资源比如打开的文件、socket 连接不一样,这类资源使用完后不关闭后会造成句柄泄露,channel 使用完后不关闭也没有关系,channel 没有被任何协程用到后最终会被 GC 回收。

关闭 channel 一般是用来通知其他协程某个任务已经完成了。golang 也没有直接提供判断 channel 是否已经关闭的接口,虽然可以用其他不太优雅的方式自己实现一个:

不过实现一个这样的接口也没什么必要。因为就算通过 isClosed() 得到当前 channel 当前还未关闭,如果试图往 channel 里写数据,仍然可能会发生 panic ,因为在调用 isClosed() 后,其他协程可能已经把 channel 关闭了。

参考技术A 写入channel的时候判断其是否已经关闭
_,ok := <- jobs
此时如果 channel 关闭,ok 值为 false,如果 channel 没有关闭,则会漏掉一个 jobs本回答被提问者采纳

为啥在关闭/打开应用程序后未保存的修改后的 NSManagedObject 在 isUpdated 上返回 FALSE?

【中文标题】为啥在关闭/打开应用程序后未保存的修改后的 NSManagedObject 在 isUpdated 上返回 FALSE?【英文标题】:Why an unsaved modified NSManagedObject returns FALSE on isUpdated after closing/opening app?为什么在关闭/打开应用程序后未保存的修改后的 NSManagedObject 在 isUpdated 上返回 FALSE? 【发布时间】:2011-08-19 20:16:18 【问题描述】:

为什么一个未保存但已修改的 NSManagedObject 有一个空的 -changedValues 并在关闭/打开应用程序(在后台运行)后在 -isUpdated 上返回 FALSE?

我不想在applicationDidEnterBackground 上保存修改后的NSManagedObject,但我想知道它是否在applicationWillEnterForeground 之后更新。

在我的实现中,我得到一个 empty [object changedValues]FALSE [object isUpdated]

这正常吗?我该怎么做才能不保存修改的对象,退出应用程序,返回并获取isUpdated TRUE

【问题讨论】:

【参考方案1】:

applicationDidEnterBackground 中只需检查isUpdated 并为结果设置一个变量。在applicationWillEnterForeground 检查您的变量。

但是,我认为这不是好的做法。为什么你不想在进入后台时保存?您想保留更改,然后保存;或者你不这样做,然后把它扔掉。

请记住,一旦应用处于后台,就无法保证它会再次出现。所以规则是你应该坚持你需要的一切,以便在应用再次激活时重新创建它。

【讨论】:

我认为这也不是一个好习惯,我理解你解释的保存过程。问题是,我想让这个属性正常工作,这样我就可以在用户尝试创建新的“对象”时使用它来警告用户,就像您关闭未保存的文档并且应用程序要求您保存修改后的文档一样.但我想最简单的方法是创建一个新属性来存储“更改的内容”布尔值。感谢您的回答!

以上是关于channel关闭后立即返回false吗的主要内容,如果未能解决你的问题,请参考以下文章

[go] 检查 channel 是否已经被关闭

RepVGG

JSch : channel never closed or EOF 通道未关闭

RabbitMQ进阶

RabbitMQ进阶

Golang 高效实践之并发实践context篇