首页 > 其他分享 >协程中Flow的一些特性(冷流,流的连续型、构建器、上下文、指定协程中收集流、流的取消)

协程中Flow的一些特性(冷流,流的连续型、构建器、上下文、指定协程中收集流、流的取消)

时间:2024-03-29 17:00:41浏览次数:14  
标签:fun 协程 冷流 flow Flow value collect println

一、冷流

Flow是一种类似序列的冷流,flow构建器中的代码知道流被收集的时候才运行。

惰性生成: 冷流只有在被订阅时才会开始生成数据。在订阅之前,它不会执行任何操作,也不会产生任何数据项。

简单来讲就是现学现用,什么时候使用什么时候才调用。比如使用collect就是启动的标志。

    suspend fun coldFlow() = flow{
        println("Flow started")
        for (i in 1..3){
            delay(1000)
            emit(i)//用于产生元素的
        }
    }

    @Test
    fun testcoldFlow() = runBlocking {
        val flow = coldFlow()
        println("Starting collect...")
        flow.collect{ value -> println(value)}
        println("Starting collect again...")
        flow.collect{ value -> println(value)}
    }

运行结果可以看到,当运行到val flow = coldFlow(),这个函数并没有进行调用(没有打印Flow start),而是到调用flow.collect时才进行打印。

二、流的连续性

这很容易理解的,就是Flow收集的元素是按照顺序执行的,像水一样,先流进来就先出去,再一个关键就是这个连续性,对数据传输十分重要。

三、流的构建器

最典型的时flow 构建,除此之外还有:

四、流的上下文

就是说流的创建和收集使用同一个上下文(在同一线程里),并且不能强制更改(除非使用flowOn),例如:

没有使用flowOn:

 suspend fun contextFlow1() = flow{
        println("Flow started ${Thread.currentThread().name}")
        for (i in 1..3){
            delay(1000)
            emit(i)//用于产生元素的
        }
    }
    @Test
    fun testcontextFlow1() = runBlocking {
        contextFlow1().collect{
            value -> println("Collected $value ${Thread.currentThread().name}")
        }
    }

我们可以看到,其中的都是main主线程,而且在同一上下文,但是这并不符合我们实际开发需求,有时流的构建与收集并非在同一上下文里,此时我们需要使用flowOn

 suspend fun contextFlow1() = flow{
        println("Flow started ${Thread.currentThread().name}")
        for (i in 1..3){
            delay(1000)
            emit(i)//用于产生元素的
        }
    }.flowOn(Dispatchers.Default)
    @Test
    fun testcontextFlow1() = runBlocking {
        contextFlow1().collect{
            value -> println("Collected $value ${Thread.currentThread().name}")
        }
    }

 

这样就可以了。

五、在指定协程中收集流

就是说我们收集的流不在本线程调用了(collect),而是交给其他协程去调用,这在实际开发中也经常使用,这时要使用launchln

   fun event() = (1..3)
        .asFlow()
        .onEach { delay(1000) }
        .flowOn(Dispatchers.Default)
    @Test
    fun textflowLaunchIn() = runBlocking { 
        event().onEach { event -> println("Event: $event ${Thread.currentThread().name}" ) }
            .launchIn(CoroutineScope((Dispatchers.IO)))
            .join()
    }

可见,这交给了后台线程去处理

六、流的取消

1.流会随着所在的协程取消而取消

2.

就是说一般的流操作可以取消的,比如使用cancel

但是呢。像asFlow这种流构建器不会执行取消操作,这时你想取消得使用cancelable

标签:fun,协程,冷流,flow,Flow,value,collect,println
From: https://blog.csdn.net/weixin_63071224/article/details/137147429

相关文章

  • 安装TensorFlow和使用sublime编辑器
    确定要安装TensorFlow1.6后,查找对应版本,TensorFlow1.6与python3.6,python3.6与Anaconda3-5.2.0兼容一、安装TensorFlow1、第一步、安装合适的anaconda安装包。如系统类型是windows64位操作系统,双击Anaconda3-5.2.0-Windows-x86_64.exe。(要先下载到本地,尽量放在一个文件夹下)进......
  • 协程&异步编程
    协程,也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行协程一般应用在有IO操作的程序中,因为协程可以利用IO等待的时间去执行一些其他的代码,从而提升代码执行效率。async事件循环事件循环,可以理解为while循环,在周期性......
  • Tensorflow 中conv2d_transpose函数output_shape参数的由来和范围
    目录1.卷积和转置卷积(1)卷积(2)转置卷积2.tf.nn.conv2d函数和tf.nn.conv2d_transpose函数(1)tf.nn.conv2d函数(2)tf.nn.conv2d_transpose函数3.转置卷积output_shape参数的探讨(1)卷积过程中,存在尺度丢失现象。(2)转置卷积是恢复卷积之前原始信息的过程1.卷积和转置卷积(1)卷积......
  • 在Python中如何使用协程进行并发操作
    在Python中使用协程进行并发操作是一种高效的方式来处理I/O密集型任务或者在单个Python程序内部执行多个操作。本文将详细介绍如何在Python中使用协程进行并发操作,包括协程的基本概念、如何创建和运行协程、如何使用任务来管理多个协程,以及如何利用协程进行并发网络请求等。最......
  • ETL工具-nifi干货系列 第五讲 处理器GenerateFlowFile
    1、今天我们一起来学习处理器GenerateFlowFile。这个处理器创建带有随机数据或自定义内容的FlowFiles。GenerateFlowFile对于负载测试、配置和模拟非常有用。从工具栏拖动处理器到画布,然后选择GenerateFlowFile即可。 2、点击add按钮或者双击 GenerateFlowFile可将此处理器......
  • AppFlow上新——智谱ChatGLM轻松接入聊天
        智谱AI开放平台提供一系列具有不同功能和定价的大模型,包括通用大模型、超拟人大模型、图像大模型、向量大模型等,并且支持使用您的私有数据对模型进行微调。其中ChatGLM系列模型在国内也享有盛名,现在AppFlow支持了ChatGLM系列模型的接入,可以轻松实现GLM接入钉钉聊天中。......
  • cron 中开启协程执行任务
    cron中开启协程执行任务‍packagecronimport( "project/internal/jobs" "github.com/robfig/cron/v3")funcRun(){ c:=cron.New(cron.WithSeconds())//每分钟的第40秒执行 c.AddJob("40,*****",jobs.OneMinuteJob{}) //启动一个......
  • module ‘tensorflow‘ has no attribute ‘placeholder‘问题的解决
    问题描述下载好tensorflow之后,就报错了~~~就显示tensorflow没有那个属性问题解决依据网上给出的答案,官网给出的解决方案是将importtensorflowastf换成:importtensorflow.compat.v1astftf.disable_v2_behavior()需要注意的是,在我们复制之后,它会提示有报错,不过没有......
  • C# 异步与 Unity 协程(实例讲解)
    C#异步编程实例:假设我们有一个需要从Web获取数据的简单应用。我们可以使用C#的异步编程模型来避免UI线程被HTTP请求阻塞1usingSystem.Net.Http;2usingSystem.Threading.Tasks;34publicclassAsyncExample5{6publicasyncTask<string>FetchDataFromWebAsync(st......
  • relocation overflow log
    问题背景:https://airflow-megengine.iap.hh-d.brainpp.cn/log?dag_id=megbrain-release&task_id=prebuild-cu111&execution_date=2022-10-08T06%3A06%3A51%2B00%3A00#megengine发版时,跑cu11.1prebuildFAILED,该错误挂在linkinglibmegengine.so,错误原因为relocationoverflow。......