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

Kotlin 协程的上下文和调度器介绍-Dispatchers

而我们通常在使用launch 或者async时可以通过可选参数定义CoroutineContext 对象。然后它会帮我们指定一个调度器对象。...非受限的调度器是一种高级机制,可以在某些极端情况下提供帮助而不需要调度协程以便稍后执行或产生不希望的副作用, 因为某些操作必须立即在协程中执行。非受限调度器不应该在通常的代码中使用。...因此它与这个启动的作用域无关且独立运作。...但是子协程仍然处于活动状态,那么整个协程就仍然属于活动状态。 当然,我们如果主动调用.cancel() 那么子协程还没有运行完也会被强制结束了。 这就是协程中的父子协程之间的关系了。...// 它是使用Dispatchers.Main作为调度器的适配UI线程 private val mainScope = MainScope() //关闭的时候 取消作用域 fun

46210

Web性能优化之Worker线程(下)

返回服务工作线程作用域的「完整 URL 路径」 2....作用域限制 ❝服务工作线程「只能拦截其作用域内」的客户端发送的请求 ❞ 「作用域是相对于获取服务脚本的路径定义的」。如果没有在 register()中指定,则作用域就是服务脚本的路径。...),以及当前使用了多少空间 navigator.storage.estimate() .then(console.log); 线程客户端 服务工作线程会使用 Client 对象跟踪「关联的窗口」、「...该方法可用于回应点击通知的操作,此时服务工作线程可以检测单击事件并作为响应打开一个窗口 claim(): 1. 强制性设置当前服务工作线程以控制其作用域中的所有客户端。...如果没有「活动的」服务工作线程,则新安装的服务工作者线程会跳 到这个状态,并直接进入激活中状态,因为没有必要再等了。

2.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android面试题之Kotlin协程一文搞定

    我们无法直接访问这些状态,可以通过访问Job的属性:isActive、isCancelled和isCompleted 如果协程处于活跃状态,协程运行出错或是调用job.cancel(),都会将当前任务置为取消中...,而runBlocking是在主线程中 协程作用域构建器 coroutineScope、runBlocking、supervisorScope runBlocking是常规函数,会阻塞当前线程;coroutineScope...是挂起函数,不会阻塞当前线程 它们都会等待协程体以及所有子协程结束,一个是阻塞线程等待,一个是挂起等待 协程作用域构建器 coroutineScope、supervisorScope coroutineScope...和CoroutineScope coroutineScope是一个挂起函数,是协程作用域构建器,CoroutineScope()是一个普通函数 coroutineScope后面的协程作用域的协程上下文是继承父协程作用域的上下文...CoroutineScope()有自己的作用域上下文 都能够进行解构化并发,可以很好的管理多个子协程 协程的取消 取消作用域会取消它的子协程 被取消的子协程不会影响其余兄弟协程 协程通过抛出一个特殊的异常

    20310

    WorkBox 之底层逻辑Service Worker

    Cache API可以在Service worker作用域内和「主线程」作用域内访问。该特性为用户操作与 Cache 实例的交互提供了许多可能性。...因为service worker「已经注册并处于活动状态」,它正在「控制」页面。将显示一个包含service worker作用域、当前状态和其 URL 的表单。...在这里,作用域是整个origin,因为它是从根目录加载的。 当注册开始时,service worker的状态被设置为installing。 ❝一旦注册完成,「安装」就开始了。 ❞ 2....假设service worker的URL或作用域未更改,「只有在其内容发生变化时,当前安装的service worker才会更新到新版本」。...当Service Worker处于活动状态时,强制刷新也将完全绕过Service Worker。

    44520

    kotlin--协程的启动和取消

    ,那么该协程将直接进入异常结束状态 4.UNDISPATCHED:协程创建后立即在当前函数调用栈中执行,直到遇到第一个真正挂起的点 1-3是需要调度器的,还记得我们前面学习过的调度器么,如果调度器中线程池满了...1.runBlocking与coroutineScope runBlocking是常规函数,它会阻塞主线程,而coroutineScope是挂起函数,它们都会等待其协程体和子协助执行结束,作用域构建器使用的是父协程的上下文...二、协程取消 1.协程的取消 1.取消作用域会取消它的子协程,CoroutineScope是创建一个全新的协程上下文,和coroutineScope作用域是不同的,作用域构建器使用的是父协程的上下文 fun...2.CPU密集型任务取消 1.isActive是一个可以被使用在CorountineScope中的扩展属性,检查Job是否处于活跃状态 fun `test cancel cpu`() = runBlocking...println("finished") } 结果: sleep:0 sleep:1 sleep:2 start cancel finished 2.ensureActive函数,如果job处于非活跃状态

    1K30

    Kotlin中的协程及在Android中的应用

    通过一个协程作用域的扩展方法async启动一个协程,不会阻塞调用它的线程,返回值是 Deferred。...{ Log.e("协程","我们使用launch启动了一个协程") } GlobalScope.async { Log.e("协程","我们使用async启动了一个协程") } 作用域...比如:网络请求,数据库操作,文件操作等 Main:UI调度器,只有在UI编程平台上有意义,用于更新UI,例如Android中的主线程 Unconfined:非受限调度器,无所谓调度器,当前协程可以运行在任意线程上...我们前面查看launch和async方法时,看到他们的第一个参数都是context: CoroutineContext ,是的,我们可以从这里传入我们需要的上下文,并且会覆盖掉协程作用域里的上下文。...rememberCoroutineScope() 会创建一个协程作用域对象,并将其与当前 Composable 的生命周期相关联。

    19410

    带你了解浏览器工作过程

    作用域链:变量查找沿着各作用域一层层向外部引用指向的执行上下文查找,形成一个链条,即作用域链条 函数的作用域由词法作用域决定 词法作用域:是指作用域是函数声明的位置来决定的,和函数怎么调用无关 3....手动回收,如设置变量为null 自动回收 (1)栈内存回收 当Javascript代码执行时,记录当前执行状态的指针(称为 ESP),指向当前执行上下文的指针,当前函数代码之前完毕,指针下移指向下一个要执行的函数执行上下文...(老生代垃圾数据) 副垃圾回收器:负责回收生存时间短的垃圾数据(新生代垃圾数据) 第一步,标记堆内存中活动对象和非活动对象 活动对象:还在使用的数据 非活动对象:垃圾数据 第二步,回收非活动数据所占据的内存...状态的promise,进入后面的then catch执行失败,返回的是一个rejected的promise,进入后面的catch async/await async/await出现的原因:undefinedPromise...CSRF攻击,跨站请求伪造(Cross Site Request Forgery) 目的是利用服务器的漏洞和用户的登录状态来实施攻击 发起CSRF攻击的方式: 通过,自动跳转到恶意网站

    1.7K40

    协程三问—快手真题

    协程,kotlin中一个神奇的组件,由于使用方便任意切换被广大开发者使用,今天就来看看协程: 说说你对协程的理解 说下协程具体的使用 协程怎么取消 说说你对协程的理解 在我看来,协程和线程一样都是用来解决并发任务...所以协程和线程是属于一个层级的概念,但是对于kotlin中的协程,又与广义的协程有所不同。kotlin中的协程其实是对线程的一种封装,或者说是一种线程框架,为了让异步任务更好更方便使用。...(parameter1) } val value2 = async { request2(parameter2) } val value3 = async { request3(parameter3...// 协程作用域 scope val job1 = scope.launch { … } val job2 = scope.launch { … } scope.cancel() 取消子协程 // 协程作用域...比如上述的job1,正常情况处于active状态,调用了cancel方法后,协程会变成Cancelling状态,工作完成之后会变成Cancelled 状态,所以可以通过判断协程的状态来停止工作。

    46630

    Kotlin协程系列(三)

    2.launch函数启动一个协程   在Android开发中,我们一般将协程的作用域和Android组件的lifeCycle绑定在一起,这样,当组件销毁的时候,协程的作用域就会取消,协程也就销毁了,这样不会造成内存泄漏...在ViewModel中,我们可以直接使用viewModelScope这个作用域去创建协程,在Activity/Fragment这些拥有生命周期的组件中,我们可以使用lifecycleScope去创建协程...LAZY:只有协程被需要时,包括主动调用start,join,await等函数时才会开始调度,如果调度前被取消协程就会进入异常结束状态 UNDISPATCHED:协程创建之后立即在当前函数的调用栈中执行...lauch函数的返回值是Job对象,Job对象常用的属性和函数如下: isActive:判断Job是否处于活动状态 isCompleted:判断Job是否属于完成状态 isCancelled:判断Job...而且有了withContext之后,在Android开发的时候,就可以不再使用Handler了,我们可以在需要进行耗时操作(网络请求,数据库读写,文件读写)时,使用withContext切换到IO线程上

    27410

    Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~

    3.2 协程调度器 在 3.1 中已经出现过调度器的身影,就是当需要指定协程运行的线程时,使用调度器调度即可。在实际的使用中是通过 Dispatchers 对象来访问它们。...; UNDISPATCHED:表示协程创建后立即在当前函数调用栈中执行,是运行在协程创建时所在的线程。...GlobalScope:通常被用于启动一个顶级协程(顶级协程是顶级作用域,即没有父协程的作用域),这种协程的生命周期是会伴随应用的整个生命周期,不会被取消掉,所以要非常谨慎的使用,容易造成内存泄漏。...使用 MainScope 需要注意,在当前 UI 页面将要被回收时,需要调用 cancel 方法取消,避免内存泄漏。...在等待子 job 完成时也是处于活跃状态;isCompleted:true 表示 job 因为某种原因已经完成,值得注意的是,如果 job 被取消或者执行失败,也是已经完成状态;父 job 只有当所有子

    1.6K30

    Kotlin 协程之Practice

    //可以使用 coroutineScope 构建器来声明你自己的作用域的。...它启动了一个新的协程作用域并且在所有子协程执行结束后并没有执行完毕。     ...// runBlocking 和 coroutineScope 主要的不同之处在于后者在等待所有的子协程执行完毕时并没有使当前线程阻塞     private fun testCoro() = runBlocking...对象一个轻量级非阻塞future,使用await在一个延期的值上得到结果,它是一个接口继承自Job对象,也就是说它也是一个job对象,可以进行取消操作     //async 风格函数   该函数不是挂起函数...挂起后,它将完全由所运行的线程中恢复挂起函数,     //非受限调度器是合适的,它在协程没有消耗CPU时间或共享数据时被限制在指定线程中     fun testDispatcherMain() =

    1.2K20

    Spring系列四:Bean Scopes作用域

    在这六个范围中,只有在使用支持Web的applicationContext时,其中四个可用。singleton和prototype作用域可用于任何类型的ioc容器。...prototype 与单例相反,每次请求bean时,它都会创建一个新实例。 request 在HTTP请求(Request) 的完整生命周期中,将创建并使用单个实例。...每次应用程序对Bean进行请求时,原型作用域都会创建一个新的Bean实例。...request作用域 在请求范围中,容器为每个HTTP请求创建一个新实例。因此,如果服务器当前处理50个请求,那么容器最多可以有50个bean类的单独实例。...自定义线程作用域 Spring还使用类SimpleThreadScope提供了非默认线程作用域。若要使用此作用域,必须使用CustomScopeConfigurer类将其注册到容器。

    86810

    前端面试指南--JS面试题总结

    ES6中有全局作用域、函数作用域和块级作用域三层概念。 当一个变量在当前块级作用域中未被定义时,会向父级作用域(创建该函数的那个父级作用域)寻找。...(1)函数的执行上下文只在函数被调用时生成,而其作用域在创建时已经生成; (2)函数的作用域会包含若干个执行上下文(有可能是零个,当函数未被调用时)。 9. this指向的各种情况都有什么?...参考 前端进阶面试题详细解答10.如何改变this指针的指向?可以使用apply、call、bind方法改变this指向(并不会改变函数的作用域)。...Promise的缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生的错误无法捕获; (3)当处于pending状态时,无法得知其具体发展到了哪个阶段...定时器中的回调会在执行栈被清空且定时达成时推入执行栈中执行。 promise、async异步函数的回调会被推入到微任务队列中,当执行栈被清空且异步操作完成时立即执行。

    89030

    前端面试指南之JS面试题总结

    当一个变量在当前块级作用域中未被定义时,会向父级作用域(创建该函数的那个父级作用域)寻找。如果父级仍未找到,就会再一层一层向上寻找,直到找到全局作用域为止。这种一层一层的关系,就是作用域链 。...作用域和执行上下文的区别是什么?(1)函数的执行上下文只在函数被调用时生成,而其作用域在创建时已经生成; (2)函数的作用域会包含若干个执行上下文(有可能是零个,当函数未被调用时)。...10.如何改变this指针的指向?可以使用apply、call、bind方法改变this指向(并不会改变函数的作用域)。...Promise的缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生的错误无法捕获; (3)当处于pending状态时,无法得知其具体发展到了哪个阶段...定时器中的回调会在执行栈被清空且定时达成时推入执行栈中执行。 promise、async异步函数的回调会被推入到微任务队列中,当执行栈被清空且异步操作完成时立即执行。

    83500

    前端面试指南之JS面试题总结2

    ES6中有全局作用域、函数作用域和块级作用域三层概念。 当一个变量在当前块级作用域中未被定义时,会向父级作用域(创建该函数的那个父级作用域)寻找。...(1)函数的执行上下文只在函数被调用时生成,而其作用域在创建时已经生成; (2)函数的作用域会包含若干个执行上下文(有可能是零个,当函数未被调用时)。 9. this指向的各种情况都有什么?...参考 前端进阶面试题详细解答10.如何改变this指针的指向?可以使用apply、call、bind方法改变this指向(并不会改变函数的作用域)。...Promise的缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生的错误无法捕获; (3)当处于pending状态时,无法得知其具体发展到了哪个阶段...定时器中的回调会在执行栈被清空且定时达成时推入执行栈中执行。 promise、async异步函数的回调会被推入到微任务队列中,当执行栈被清空且异步操作完成时立即执行。

    79820

    来聊聊C++中头疼的线程、并发

    example.try_lock()==true){ //拿到锁,做事 }else{ //没拿到锁做事 } unique_lock成员函数 lock() //可以手动加锁,手动加锁后,你可以不用手动开锁,离开作用域后自动放锁...函数把自身阻塞(block)并挂到条件变量的线程队列中 若满足该条件,拥有互斥锁的线程在临界区内访问共享资源,在退出临界区时通知(notify)在条件变量的线程队列中处于阻塞状态的线程,被通知的线程必须重新申请对该互斥锁加锁.... std::launch::async在调用async函数时,就开始创建线程 async函数默认用的就是std::launch::async标记 #include #include...,该std::atomic_flag对象在创建时处于clear状态。...() 默认构造函数,由默认构造函数创建的 std::atomic 对象处于未初始化(uninitialized)状态,对处于未初始化(uninitialized)状态 std::atomic对象可以由

    5.1K41

    Kotlin协程解析系列(上):协程调度与挂起

    其中GlobalScope本身就是一个作用域,launch属于其子作用域。 CoroutineScope.launch() 启动一个新的协程而不阻塞当前线程,并返回对协程的引用作为一个Job。...启动协程需要作用域,但是作用域又是在协程创建过程中产生的。 图片 官方提供的常用作用域: runBlocking: 顶层函数,可启动协程,但会阻塞当前线程 GlobalScope 全局协程作用域。...当这个作用域中的任何一个子协程失败时,这个作用域失败,所有其他的子协程都被取消。...会与当前的UI组件绑定生命周期,界面销毁时该协程作用域将被取消,不会造成协程泄漏,推荐使用。...等作用域进行使用,异常丝滑好用。

    2K40

    前端基础知识整理汇总(上)

    作用域 简单来说作用域就是一个区域,没有变量。作用域可以嵌套。作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。作用域在函数定义时就已经确定了,不是在函数调用确定。...特点 处于活动状态的执行上下文环境只有一个, 只有栈顶的上下文处于活动状态,执行其中的代码。 函数每调用一次,都会产生一个新的执行上下文环境。...不过只有处于函数调用栈栈顶的执行上下文中的变量对象,才会变成活动对象。...然后使用arguments和其他命名参数的值来初始化函数的活动对象。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位...直至作为作用域链终点的全局执行环境。...无论什么时候在函数中访问一个变量时,就会从作用域链中搜索具有相同名字的变量,一般来讲,当函数执行完毕,局部活动对象就会被销毁,内存中仅保存全部作用域的活动对象。但是,闭包不同。

    1.3K10

    异步JS中的Web Workers

    运行在另一个全局上下文中, 有自己的作用域, 与当前的 window 不同, 也无法直接访问Window对象....[MDN解释] 简单理解, 其实就是有一个独立于当前网页线程的后台线程, 在网页发起请求时进行代理,并缓存相关文件, 以便用户可以进行离线访问....通常是基于当前的 location来解析传入的路径. const registerServiceWorker = async () => { if ('serviceWorker' in navigator...的 Service Workers 中可以看到对应 SW的一些状态记录, 以及可以对其进行相应的操作 同样使用 chrome 开发者工具, 可以查看 SW 线程的一些相关信息, 以及终止 SW 线程...其实除了 Web Workers 中的多线程, Nodejs中同样也有相应的多线程处理方式, 可见多线程的作用之大.

    1.7K20
    领券