Kotlin协程 — 子协程中无法进行IO、网络请求等并发

⼦协程 :
当⼀个协程被其它协程在 CoroutineScope 中启动的时候,它将通过CoroutineScope.coroutineContext 来承袭上下⽂,并且这个新协程的 Job 将会成为⽗协程作业的⼦作业。当⼀个⽗协程被取消的时候,所有它的⼦协程也会被递归的取消。
然⽽,当 GlobalScope 被⽤来启动⼀个协程时(顶层协程),它与作⽤域⽆关且是独⽴被启动的协程 。

下面有个例子用来测试子协程中是否可以进行网络请求并发:
在这里插入图片描述
上图中的两个http页面返回时间都在服务器设置了为固定的2秒,也就是说如果子协程如果支持并发的话,总耗时应该是2秒多一点,运行结果是4秒多,很显然子协程中并不支持网络请求的并发。下面将用顶层协程来重新测试:
在这里插入图片描述
从结果中可以看出使用顶层协程是可以进行网络请求并发的,那为什么子协程中无法进行并发呢?原因是所有的子协程都是跟父协程共享一条线程,当子协程中有挂起函数被调用后,共享的线程就会切换到到别的子协程或父协程中去处理需要处理的事务,但是网络请求不是挂起函数,挂起函数不会阻塞线程,网络请求是会阻塞线程的。拿上面的第一个例子来说,第一个协程在进行网络请求的时候线程被阻塞了,只有等这个网络请求之后,共享线程才可以切换到第二个子协程中去进行网络请求,所以就无法进行并行请求了。究其原因就

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值