协程函数
Posted 黄土地上的黑石头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协程函数相关的知识,希望对你有一定的参考价值。
1、协程函数吃包子简洁案例
下面代码中需要注意的是,yield的位置和作用,仔细看运行原理
def eater(name): print(‘%s start to eat food‘ %name)#第一个print while True: food=yield print(‘%s get %s ,to start eat‘%(name,food))#第二个print print(‘done‘) e=eater(‘钢蛋‘)#e是生成器 print(e)#打印生成器的内存地址 print(next(e))#next触发函数执行,执行第一个print后碰到yield是停止,但yield后面没有值,所以返回None # >>钢蛋 start to eat food # >>None print(next(e))#next触发函数执行,再上一个yield处开始运行,打印第二个print-->while true->又碰到yield后停止,但yield后面没有值,所以返回None # >>钢蛋 get None ,to start eat # >>None
既然yield以表达式的形式出现了,我们就不得不想到赋值,那要赋值就得先传值,这里就会用到g.send(value),g指生成器,g.send(value)作用就和next(g)差不多一样,都是会触发函数进行运行一次,不一样的是,g.send(value)会把参数value传给yield再由yield赋值给等式另一边的对象,这个参数不会作为yield的返回值
def eater(name): print(‘%s start to eat food‘ %name)#第一个print while True: food=yield print(‘%s get %s ,to start eat‘%(name,food))#第二个print print(‘done‘) e=eater(‘钢蛋‘)#e是生成器 next(e)#next触发执行一次打印第一个print后碰到yield停止,这里没有打印 # >>钢蛋 start to eat food e.send(‘包子‘)#send和next一样都会触发函数运行,碰到yield后停止得到一个返回值,不一样的地方就是send会把自己的参数交给当前暂停的yield,再由yield交给他赋值给的对象,这里是food,然后打印第二个print在经过whiletrue碰到yield停止,这里没有打印e.send(‘包子‘)的返回值 # >>钢蛋 get 包子 ,to start eat print(e.send(‘包子‘))#加上上面的运行结果后,还要返回None,因为yield后面依旧没有值,所以send执行完后他传入的参数也没了 # >>钢蛋 get 包子 ,to start eat # >>None
吃包子欢乐行,yield的返回值就是包子单,注意运行原理,始终围绕yield走
def eater(name): print(‘%s start to eat food‘ %name)#第一个print food_list=[] while True: food=yield food_list print(‘%s get %s ,to start eat‘%(name,food))#第二个print food_list.append(food) print(‘done‘) e=eater(‘钢蛋‘)#e是生成器 print(next(e)) print(e.send(‘包子‘)) print(e.send(‘韭菜包子‘)) print(e.send(‘榴莲包子‘)) #运行结果如下: # 钢蛋 start to eat food # [] # 钢蛋 get 包子 ,to start eat # [‘包子‘] # 钢蛋 get 韭菜包子 ,to start eat # [‘包子‘, ‘韭菜包子‘] # 钢蛋 get 榴莲包子 ,to start eat # [‘包子‘, ‘韭菜包子‘, ‘榴莲包子‘]
以上是关于协程函数的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )
Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )
Kotlin 协程协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )
Kotlin 协程Flow 异步流 ⑤ ( 流的上下文 | 上下文保存 | 查看流发射和收集的协程 | 不能在不同协程中执行流的发射和收集操作 | 修改流发射的协程上下文 | flowOn函数 )
Kotlin 协程Flow 异步流 ⑤ ( 流的上下文 | 上下文保存 | 查看流发射和收集的协程 | 不能在不同协程中执行流的发射和收集操作 | 修改流发射的协程上下文 | flowOn函数 )