Fra*_*cia 36 channel stream kotlin kotlin-coroutines
我最近在学习和阅读很多关于Flow和 Kotlin 协程的内容。但是我仍然对什么时候应该使用Flow以及什么时候应该使用Channel.
一开始看起来更简单。使用热数据流?Channel. 冷的?Flows. 如果您需要从多个地方收听数据流,情况也是如此;如果是这样的话Channel是选择去。还有很多例子和问题。
但是最近FlowChannels引入了大量方法和类,这些方法和类鼓励使用Flow,转换Channels成哪些设施Flows等等。随着每个 Kotlin 版本中出现所有这些新东西,我越来越困惑。所以问题是:
什么时候应该使用Channel,什么时候应该使用Flow?
Mar*_*nik 29
对于迄今为止最好的工具的许多用例Channel,Flow已成为新的最佳工具。
作为一个具体的例子,callbackFlow现在是从 3rd-party API 的回调接收数据的最佳方法。这在 GUI 设置中特别有效。它将回调、通道和关联的接收协程都耦合在同一个自包含Flow实例中。仅在收集流时注册回调。取消流程会自动传播到关闭通道和取消注册回调。您只需要提供一次回调注销代码。
您应该将其Channel视为Flow在其实现中使用的较低级别的原语。只有在您意识到Flow不符合您的要求后才考虑直接使用它。
在我看来,这里有一个很好的解释(Roman Elizarov)冷流,热通道:
通道非常适合对本质上很热的数据源、无需应用程序请求而存在的数据源进行建模:传入网络连接、事件流等。通道,就像期货一样,是同步原语。当您需要将数据从一个协程发送到相同或不同进程中的另一个协程时,您应该使用通道
但是如果我们不需要并发或同步,而只需要非阻塞的数据流呢?直到最近我们才拥有一个类型,所以欢迎 Kotlin Flow类型......
与通道不同,流本质上不涉及任何并发性。它们是非阻塞的,但是是顺序的。流的目标是让异步数据流成为异步操作的挂起函数——方便、安全、易于学习和使用。
将流视为数据流,将通道视为队列。流就是处理可能不会停止的连续数据流。它们\xe2\x80\x99非常适合数据不断传入的场景,例如监控传感器读数或实时用户交互。
\n另一方面,通道的工作方式类似于队列,您可以将数据逐个放入和取出。然而,通过 Channel 发送的每个事件都由单个订阅者消耗,这与 Flows 不同,Flows 的每个发射都在所有收集器之间共享。此行为是通道基本设计的一部分,通常称为 \xe2\x80\x9csingle-consumer \xe2\x80\x9d 语义。它确保数据的顺序和流动得到维护,并且每条数据都由单个协程或消费者处理。此特性在您想要保证数据按特定顺序处理或您想要的场景中特别有用以避免多个消费者同时访问相同数据时可能出现的竞争情况。当您有一个消费者(协程)需要以受控方式接收数据时,通道特别有用,以确保每条数据仅被使用一次。
\n当多个消费者主动从一个通道消费数据时,通道\xe2\x80\x99s的行为是按顺序轮流向每个消费者传递数据。这可以确保没有消费者独占所有数据,并且所有消费者都有机会处理他们收到的数据。这种公平分配机制在多个消费者同时工作并且希望防止任何一个消费者垄断的场景中特别有用数据处理。它可以促进资源利用率的平衡,并防止应用程序中出现潜在的瓶颈。\n流具有内置的背压处理功能,可帮助您在数据传入速度过快时对其进行管理。\xe2\x80\x99。通道没有此内置功能,因此您在使用通道时需要手动处理背压。
\n参考:https ://androidlearnersite.wordpress.com/2023/08/09/kotlin-flows-part-4/
\n| 归档时间: | 
 | 
| 查看次数: | 8003 次 | 
| 最近记录: |