首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Kotlin协程withTimeoutOrNull需要比分配的时间更长的时间?

Kotlin协程中的withTimeoutOrNull函数用于设置一个超时时间,如果在指定的时间内未完成任务,则返回null。为什么withTimeoutOrNull需要比分配的时间更长的时间呢?

这是因为withTimeoutOrNull函数的实现机制是基于协程的挂起和恢复。在调用withTimeoutOrNull函数时,它会创建一个新的协程,并在指定的时间内等待任务完成。如果任务在超时时间内完成,withTimeoutOrNull函数会返回任务的结果;如果任务未能在超时时间内完成,withTimeoutOrNull函数会取消协程并返回null。

然而,协程的挂起和恢复是通过协作式的方式实现的,即协程自己决定何时挂起和何时恢复。因此,withTimeoutOrNull函数无法直接中断正在执行的任务,而是通过协程的挂起机制来实现超时的效果。

具体来说,withTimeoutOrNull函数会在指定的时间内定期检查是否超时,并在每次检查时挂起协程。这样做的目的是为了让其他协程有机会执行,以避免阻塞整个程序。因此,withTimeoutOrNull函数需要比分配的时间更长的时间,以便在每次检查时挂起协程并让其他协程有机会执行。

总结起来,Kotlin协程中的withTimeoutOrNull函数需要比分配的时间更长的时间,是因为它通过协程的挂起机制实现超时,需要定期挂起协程以让其他协程执行。这样做可以避免阻塞整个程序,但也导致了withTimeoutOrNull函数需要额外的时间来进行挂起和恢复操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

空间-时间权衡在Go语言中应用:以任务分配为例

本文将以Go语言中任务分配问题为例,探讨如何在实际开发中应用空间-时间权衡。...问题背景 假设我们有一个系统需要执行多种任务,如 "ROTATE"、"SYNC"、"SCAN"、"VERIFY" 等,我们打算为每种任务创建10个来并发处理。...为了避免增加额外数据结构,我们希望通过任务名称,始终选择使用固定数量且对应。 空间-时间权衡应用 在这种情况下,我们可以使用空间-时间权衡策略来解决问题。...我们可以选择用计算来代替存储,这样就不需要额外数据结构,而是通过计算得到对应。 具体来说,我们可以为每个任务名称定义一个哈希函数,将任务名称转换为一个数字,然后用这个数字来选择对应。...这种方法优点是它避免了额外数据结构,减少了内存使用。缺点是它增加了CPU使用,因为每次选择时都需要计算哈希值。

17010

“新”for me,2022一起来看看这些技术

性能 是官方推荐Kotlin官方文档上面虽然在说线程更好,但是实际上你会发现在单线程情况下,其实并没有区别。(多线程的话有区别记着先看一下他们用线程池)。...开发效率 用一个字爽,这也是他优点同步写异步代码,但是并不只是它有,其他工具也可以提供。但是,flow,kotlin语言等等这些都可以和协配合,封装了底层操作,更友好支持。...这里给大家贴一下之前遇到一个坑(简化版): //withTimeoutOrNull这个方法意思是指定超时时间结束后将返回null(我返回是0) val result= withTimeoutOrNull...:0 //代表之后操作 val a=0 这个时候他不会返回0,也就是阻塞住了,a=0一直不会走到。这是为什么呢?这里涉及到异常取消机制了。 中创建了子后,会默认建立父子关系。...当父取消后,需要把它所有的子全部取消掉,才算取消完成。刚刚创建是不支持取消,所以一直堵塞住了。 怎么解决呢?

19820

分享一波学习方向

性能 是官方推荐Kotlin官方文档上面虽然在说线程更好,但是实际上你会发现在单线程情况下,其实并没有区别。(多线程的话有区别记着先看一下他们用线程池)。...丰富api 中很多api在使用时候如果不了解它里面的一些原理机制,出现问题几率是非常大… 这里给大家贴一下之前遇到一个坑(简化版): //withTimeoutOrNull这个方法意思是指定超时时间结束后将返回...null(我返回是0) val result= withTimeoutOrNull(指定超时时间为5秒){ //创建一个 suspendCoroutine{ //在这里进行阻塞代码...:0 //代表之后操作 val a=0 这个时候他不会返回0,也就是阻塞住了,a=0一直不会走到。这是为什么呢?这里涉及到异常取消机制了。 中创建了子后,会默认建立父子关系。...当父取消后,需要把它所有的子全部取消掉,才算取消完成。刚刚创建是不支持取消,所以一直堵塞住了。 怎么解决呢?

26220

Python 异步: 等待有时间限制(12)

这允许调用者既可以设置他们愿意等待任务完成时间,又可以通过在超时结束时取消任务来强制执行超时。 现在我们知道了 asyncio.wait_for() 函数是什么,让我们看看如何使用它。 2....如果等待任务因未处理异常而失败,则该异常将传播回等待 wait_for() 调用者,在这种情况下可能需要处理它。...带有超时 Asyncio wait_for() 示例 我们可以探索如何在任务完成之前等待具有超时。在此示例中,我们执行上述,但调用方等待 0.2 秒或 200 毫秒固定超时。...main() 在超时结束后恢复。 wait_for()取消task_coro(),main()挂起。 task_coro() 再次运行并响应要终止请求。...main() 恢复并处理由 task_coro() 引发 TimeoutError。 这突出显示了我们如何调用带超时 wait_for() 函数,并在任务未在超时内完成时取消任务。

2.2K00

Python 异步: 等待有时间限制(12)

这允许调用者既可以设置他们愿意等待任务完成时间,又可以通过在超时结束时取消任务来强制执行超时。 现在我们知道了 asyncio.wait_for() 函数是什么,让我们看看如何使用它。 2....如果等待任务因未处理异常而失败,则该异常将传播回等待 wait_for() 调用者,在这种情况下可能需要处理它。...带有超时 Asyncio wait_for() 示例 我们可以探索如何在任务完成之前等待具有超时。在此示例中,我们执行上述,但调用方等待 0.2 秒或 200 毫秒固定超时。...main() 在超时结束后恢复。 wait_for()取消task_coro(),main()挂起。 task_coro() 再次运行并响应要终止请求。...main() 恢复并处理由 task_coro() 引发 TimeoutError。 这突出显示了我们如何调用带超时 wait_for() 函数,并在任务未在超时内完成时取消任务。

1.8K50

【翻译】忘了RxJava吧——你需要是拥抱Kotlin(Part 12)

【翻译】忘了RxJava吧——你需要是拥抱Kotlin(Part 1/2) 2018-08-31 by Liuqingwen | Tags: Kotlin Android 翻译 |...一、前言 我非常喜欢 Kotlin ,也非常喜欢 Kotlin Coroutines ,在看到了这篇文章后心里真是激动啊!于是乎——就有了这篇谷歌自动人工翻译,以飨观众!希望大家喜欢。哈哈。...在世界里,最合适对象就是 Deferred 接口了。...那么关于我们在 RxJava 代码中找到那些缺点去哪了呢?在中都解决了吗? 性能开销问题 代码产生对象数量下降到了 11 (下降了三分之一)。 ?...概要 好吧,在这里我们设法重构一些使用了 Singles 代码,替换为 Kotlin 并从中感受到一些好处。在此系列下一章节中,我们将考虑使用来处理 RxJava 更高级一些主题。

1.1K20

Kotlin 取消 ③ ( finally 释放资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消任务 | 构造超时取消任务 )

文章目录 一、释放资源 二、使用 use 函数执行 Closeable 对象释放资源操作 三、使用 withContext(NonCancellable) 构造无法取消任务 四、使用 withTimeoutOrNull...函数构造超时取消任务 一、释放资源 ---- 如果 中途取消 , 期间需要 释放占有的资源 ; 如果执行任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...(1000) Log.i(TAG, "释放占用资源完毕") } } 如果在取消后 , finally 代码块代码肯定会执行 , 但是如果 finally 中 delay...23:12:32.093 I 退出作用域 四、使用 withTimeoutOrNull 函数构造超时取消任务 ---- 使用 withTimeout 函数 , 可以构造超时取消任务...:34:36.794 I 上述任务返回值为 null

1.3K10

Kotlin 通道 Channel 介绍

所有创建了函数被定义在了CoroutineScope扩展上。所以我们可以依靠结构化并发来确保没有常驻在我们应用程序中全局。 如果到这里还是比较迷茫的话,很正常。...使用 : iterator 替换 produce、 yield 替换 send、 next 替换 receive、 Iterator 替换 ReceiveChannel 来摆脱作用域,你将不再需要...数据发出叫做扇出 示例:启动一个定期产生整数对象(每秒10个数值),再启动五个处理器接收信息。并工作一秒 。...,从而最终终止处理器正在执行此通道上迭代。...它被用来构建分段来创建复杂基于时间Produce管道和进行窗口化操作以及其他时间相关处理。 通过ticker来构建这种通道。

35210

Go 为什么进程和线程占用系统资源低?

02 切换执行单元成本 我们通过介绍线程和协切换流程,讲述为什么在内核态切换成本较高,而在用户态切换成本较低?...在编写代码时,我们为了可以让程序被分配到更多 CPU 资源,可以多创建一些线程,用于提升程序运行效率。需要注意是,线程并不是创建越多越好。...切换成本较低,是因为切换比较简单,并且是在用户态进行切换,切换时间成本较低(纳秒级),只需将当前 CPU 寄存器状态先保存起来,然后将需要 CPU 资源 CPU 寄存器状态加载到...04 总结 本文我们主要介绍为什么 Go 进程和线程占用系统资源低,通过进程、线程、 CPU 资源和内存占用比较,发现无论是在切换时消耗 CPU 资源(时间片),还是内存占用,Go...一句话总结就是 Go 切换成本和内存占用线程和进程都低。 需要注意是,Go 占用系统资源低,并不代表可以无限创建 Go

39250

Coroutine()(一)

使用,开发者可以自行控制切换时机,可以在一个函数执行到一半时候中断执行,让出CPU,在需要时候再回到中断点继续执行。...} println("Hello,") // 主在这里会立即执行 delay(2000L) // 延迟 2 秒来保证 JVM 存活 } 延迟一段时间来等待另一个运行并不是一个好选择...} println("Hello,") job.join() // 等待直到子执行结束 } 现在,结果仍然相同,但是主与后台作业持续时间没有任何关系 当我们使用 GlobalScope.launch...如果我们忘记保持对新启动引用,它还会继续运行。如果代码挂起了会怎么样(例如,我们错误地延迟了太长时间),如果我们启动了太多并导致内存不足会怎么样?...如果你需要做一些各类使用超时特别的额外操作,可以使用类似 withTimeout withTimeoutOrNull 函数,并把这些会超时代码包装在 try {...} catch (e: TimeoutCancellationException

79510

即学即用Kotlin -

前言 上周在内部分享会上大佬同事分享了关于 Kotlin 知识,之前有看过 Kotlin 一些知识,以为自己还挺了解,结果......Kotlin - 基础篇》 《抽丝剥茧Kotlin - Flow篇》 目录 一、基础 1....概念 相信大家或多或少都了解过,是什么,官网上这么说: “Essentially, coroutines are light-weight threads. 是轻量级线程,为什么是轻量?...我将会在下一篇文章中和大家讨论原理,欢迎大家关注。 学习kotlin 还是很有必要,我们团队在开发新功能时候,也全部选择了 Kotlin。...参考文章: “《最全面的Kotlin: Coroutine/Channel/Flow 以及实际应用》 《Kotlin中文站》 《Kotlin 用力瞥一眼》

1.5K20

kotlin--启动和取消

一、启动 1.launch与async构建器都用来启动新 launch:我们之前已经使用过了GlobalScopelaunch来启动,它返回一个Job async:返回一个Deferred...kotlin有4中启动模式 1.DEFAULT:创建后,立即开始调度,在调度前如果被取消,直接进入取消响应状态 2.ATOMIC:创建后,立即开始调度,执行到第一个挂起点之前不响应取消...3.LAZY:只有需要时,包括主动调用start、join或await等函数时才会开始调度,如果调度前被取消,那么该将直接进入异常结束状态 4.UNDISPATCHED:创建后立即在当前函数调用栈中执行...二、取消 1.取消 1.取消作用域会取消它,CoroutineScope是创建一个全新上下文,和coroutineScope作用域是不同,作用域构建器使用是父上下文 fun...处于取消中状态不能被挂起,如果想要取消后,还能调用挂起函数,我们需要将清理代码放入NoCancellable CoroutineContext中 这样会挂起运行中代码,并保持取消中状态

93530

Kotlin | 使用手册(不间断更新)

Kotlin作为Kotlin核心一个组件,上手成本并不高,下面的demo都是我参照官网例子过了一遍。 Kotlin中文网。 其中Flow大家可以多花点时间,还是挺有意思。...println("延迟结束") a.cancelAndJoin() //取消一个作业并等待它结束 } 在finally中重新挂起 在我们实际应用中,可能需要在finally重新挂起一个被取消...它启动了一个单独,这是一个轻量级线程并与其它所有的一起并发工作。...main-抛出异常 注意:如果其中一个子失败,则第一个 playGame 和等待中都会被取消 上下文和调度器 总是运行在以 coroutineContext 为代表上下文中,上下文是各种不同元素集合...Buffer 流发射与收集通常是按顺序执行,通过上面我们发现,将流 不同部分运行在不同中将对于时间有大幅度减少。

2.2K20

Kotlin Flow 看这一篇 带你入门~

为什么需要Flow 首先我们来回顾下Kotlin中我们如何使用挂起函数,我们在main方法中,调用挂起函数返回一组数据,代码如下所示: suspend fun loadData(): List...,我们可以看到 在main方法中,我们可以直接调用loadData方法,这是因为flow构建块中代码 就是一个suspend函数。...Flow取消 如果我们需要定时取消Flow中代码块执行,只需要使用withTimeoutOrNull函数添加超时时间即可,比如上述方法我们是在三秒内返回123,我们限定其在2500毫秒内执行完毕 fun...buffer操作符 我们在Kotlin 看这一篇就够了 中曾了解过,可以提升并发请求效率,而在Flow代码块中,每当有一个处理结果 我们就可以收到,但如果处理结果也是耗时操作,我们来看下需要多长时间来处理...,处理三个数据,一共使用了9秒钟时间

1.3K30

Kotlin系列(三)

1.前言   前面两节,我们运用了kotlin提供简单去实现了一套更易用复合,这些基本上是以官方框架为范本进行设计和实现。...虽然我们还没有直接接触kotlin官方框架,但对它绝大多数功能已经了如指掌了。...本节,我们来探讨一下官方框架更多功能,并将其运用到实际生产当中,在这里,我以在Android中使用kotlin官方框架为例进行讲述。...,直到遇到第一个真正挂起点   这里我们要搞清楚立即调度和立即执行区别,立即调度表示调度器会立即接收调度指令,但具体执行时机以及在哪个线程上执行还需要根据调度器情况而定,也就是说立即调度到立即执行前通常会隔一段时间...launch函数和async函数唯一区别就是async函数启动有返回值,如果不需要获取执行结果,那么没必要用async函数。

22410

深入分析 Java、Kotlin、Go 线程和协

目的 特点 原理 Java、Kotlin、Go 线程与 Kotlin 使用「线程」代码 使用「代码 Go Java Kilim 框架 Java...当在网上搜索时,我们会看到: Kotlin 官方文档说「本质上,是轻量级线程」。 很多博客提到「不需要从用户态切换到内核态」、「是协作式」等等。...好处 性能 Java 好很多,甚至代码实现都比 Java 要简洁很多。 那这究竟又是为什么呢?下面一一分析。... 当在网上搜索时,我们会看到: 本质上,是轻量级线程。 很多博客提到「不需要从用户态切换到内核态」、「是协作式」。...可以先看下 Kotlin 和 Go Kotlin Kotlin 在诞生之初,目标就是完全兼容 Java,却是一门非常务实语言,其中一个特性,就是支持

76130

深入分析 Java、Kotlin、Go 线程和协

目的 特点 原理 Java、Kotlin、Go 线程与 Kotlin 使用「线程」代码 使用「代码 Go Java Kilim 框架 Java...当在网上搜索时,我们会看到: Kotlin 官方文档说「本质上,是轻量级线程」。 很多博客提到「不需要从用户态切换到内核态」、「是协作式」等等。...好处 性能 Java 好很多,甚至代码实现都比 Java 要简洁很多。 那这究竟又是为什么呢?下面一一分析。... 当在网上搜索时,我们会看到: 本质上,是轻量级线程。 很多博客提到「不需要从用户态切换到内核态」、「是协作式」。...可以先看下 Kotlin 和 Go Kotlin Kotlin 在诞生之初,目标就是完全兼容 Java,却是一门非常务实语言,其中一个特性,就是支持

29710

深入分析 Java、Kotlin、Go 线程和协

目的 特点 原理 Java、Kotlin、Go 线程与 Kotlin 使用「线程」代码 使用「代码 Go Java Kilim...当在网上搜索时,我们会看到: Kotlin 官方文档说「本质上,是轻量级线程」。 很多博客提到「不需要从用户态切换到内核态」、「是协作式」等等。...好处 性能 Java 好很多,甚至代码实现都比 Java 要简洁很多。 那这究竟又是为什么呢?下面一一分析。... 当在网上搜索时,我们会看到: 本质上,是轻量级线程。 很多博客提到「不需要从用户态切换到内核态」、「是协作式」。...可以先看下 Kotlin 和 Go Kotlin Kotlin 在诞生之初,目标就是完全兼容 Java,却是一门非常务实语言,其中一个特性,就是支持

1K31

Kotlin 】Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集 | 通过取消流收集所在取消流 )

文章目录 一、调用 Flow#launchIn 函数指定流收集 1、指定流收集 2、Flow#launchIn 函数原型 3、代码示例 二、通过取消流收集所在取消流 一、调用 Flow...#launchIn 函数指定流收集 ---- 1、指定流收集 响应式编程 , 是 基于事件驱动 , 在 Flow 流中会产生源源不断事件 , 就是 发射元素操作 ; 拿到 Flow 流后...【Kotlin 】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 ; Flow#launchIn 函数返回值是 Job 对象 ,...runBlocking 主 , 需要调用 join 等待执行完毕 } } /** * 使用 flow 构建器 Flow 异步流 *...---- Flow 流 收集元素 操作 , 是在中执行 , 将 取消 , 即可将 Flow 流收集操作 取消 , 也就是 将 Flow 流取消 ; 代码示例 : 使用 withTimeoutOrNull

71820

破解 Kotlin 番外篇(1) - 为什么被称为『轻量级线程』?

Kotlin 从 v1.1 开始公测(Experimental) 到现在,已经算是非常成熟了,但大家对它看法却一直存在各种疑问,为什么呢?...因为即便我们把 Kotlin 丢掉,单纯这个东西本身就已经长时间让大家感到疑惑了,不信的话可以单独搜一下或者 Coroutine,甚至连 Lua 之父在提到为什么鲜见于早期语言实现,就是因为这概念没有一个清晰界定...真的线程有优势吗? 这可不是一个很容易回答问题。 Kotlin 刚出来时候,有人就做过性能对比,觉得没有任何性能优势。...可以基于这个思路进一步简化代码组织,虽然线程就能解决问题,但写起来其实是很累可以让你更轻松,特别是遇到多个任务需要访问公共资源时,如果每个任务都分配一个线程去处理,那么少不了就有线程会花费大量时间在等待获取锁上...我更愿意把作为更贴近业务逻辑甚至人类思考层面的一种抽象,这个抽象层次其实已经线程更高了。线程可以让我们程序并发跑,可以让并发程序跑得看起来更美好。 线程本身就可以,为什么要用呢?

1.9K20
领券