什么是Swoole 直接套用Swoole官网的介绍:PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis...Swoole提供了多线程、长连接等很多牛逼的功能,把php上升到了一个新的台阶,具体的你可以看看入门教程,本文只限于讨论Laravel和Swoole的结合。...如果你Swoole业务代码是写在一个叫server.php的文件中,那么在命令行下输入php server.php开启。...这是比较头疼的事情,因为Laravel框架可不是这样的运转的,那如何能与Laravel结合呢?没错,自定义一条Artisan Command,就这么简单。...强烈推荐在你的laravel项目中,使用 laravel-s 这个包. composer require "hhxsv5/laravel-s:~1.0" -vvv 然后,依赖 kuaiapp/db 这个包
之前我们介绍过EasyDSS开发中对野协程的管理,有兴趣的朋友可以了解一下:EasyDSS协程出现panic并导致程序退出,如何对野协程进行管理?...在 EasyDSS 的程序开发中,有时为了加快速度,会在 for 循环中采用协程的方式进行代码编写,类似代码如下: wg := sync.WaitGroup{} wg.Add(length) for s...,因为采用协程的方式, go func(){} 代码会新启动一个协程进行运行。...rtc.SubSession) { defer wg.Done() sender.WriteRtcPacket(pkt) }(s) } wg.Wait() 以上代码将前一个指针变量以传递参数的方式传递到协程中...总结以下在写协程的时候主要注意两点: 1.保证捕获协程中的 panic 异常; 2.在协程中使用外部的变量时,应该以传参的方式传递到协程中。
在上面的示例中,get()仍然在主线程上运行,但它在启动网络请求之前挂起协同程序。当网络请求完成时,get恢复暂停的协程,而不是使用回调来通知主线程。...CoroutineScope的一个重要功能是当用户离开应用程序中的内容区域时停止协程执行。 使用CoroutineScope,您可以确保正确停止任何正在运行的操作。...范围传播自己,所以如果一个协程开始另一个协同程序,两个协同程序具有相同的范围。这意味着即使其他库从您的范围启动协程,您也可以随时取消它们。如果您在ViewModel中运行协同程序,这一点尤为重要。...由于async期望在某个时刻最终调用await,它会保留异常并在await调用中重新抛出它们。 这意味着如果您使用await从常规函数启动新的协同程序,则可能会以静默方式删除异常。...这些丢弃的异常不会出现在崩溃指标中,也不会出现在logcat中。 并行分解 当函数返回时,必须停止由挂起函数启动的所有协同程序,因此您可能需要保证这些协程在返回之前完成。
在本系列第二篇文章 协程中的取消和异常 | 取消操作详解 中,我们学到,当一个任务不再被需要时,正确地退出十分的重要。...协程的最佳实践 由于本文所介绍的模式是在协程的其它最佳实践的基础之上实现的,我们可以借此机会回顾一下: 1. 将调度器注入到类中 不要在创建协程或调用 withContext 时硬编码调度器。...您可以在进行单元测试或仪器测试时轻松替换掉它们。 2. 应当在 ViewModel 或 Presenter 层创建协程 如果是仅与 UI 相关的操作,则可以在 UI 层执行。...✅ 好处: 调用者 (通常是 ViewModel 层) 可以控制这些层级中任务的执行和生命周期,也可以在需要时取消这些任务。...❌ ✅ 使用 NonCancellable 正如您在本系列第二篇文章 协程中的取消和异常 | 取消操作详解 中看到的,您可以使用 withContext(NonCancellable) 在被取消的协程中调用挂起函数
在 Android 中,一般是不建议直接使用 GlobalScope 的。那么,在 Android 中应该如何正确使用协程呢?再细分一点,如何直接在 Activity 中使用呢?...) 记着这个定义,在后面 ViewModel 的协程使用中也会借鉴这种写法。...那么如何在 ViewModel 中定义协程作用域呢?还记得上面 MainScope() 的定义吗?没错,搬过来直接使用就可以了。...调用 getMessage() 方法和之前的 launchFromMainScope() 效果也是一样的,记得在 ViewModel 的 onCleared() 回调里取消协程。...总结 以上简单的介绍了在 Android 中合理使用协程的一些方案,示例代码已上传至 Github。
而在 Presentation 层内部也有进一步的解决方案: 让一个对象可以在 Activity 和 Fragment 被销毁、重新创建时依然留存,这个对象就是架构组件的 ViewModel 类。...如何启动和取消协程 在 Jetpack 组件里,我们为各个组件提供了对应的 scope,比如 ViewModel 就有与之对应的 viewModelScope,如果您想在这个作用域里启动协程,使用如下代码即可...如前所述,我们使用 LiveData 连接 View 和 ViewModel,而在 ViewModel 这里我们则使用刚刚提到的 liveData 协程构造方法来打通 LiveData 和协程,再往右就是调用...ViewModel 模式 当 ViewModel 监听 LiveData,而且没有对数据进行任何转换操作时,可以直接将 dataSource 中的 LiveData 赋值给 ViewModel 暴露出来的...相信看到这里,您对如何在实际应用中使用协程、LiveData 和 Flow 已经有了比较系统的认识。
接下来我们一起比较 LiveData 和 Kotlin 数据流中相对应的写法吧: #1: 使用可变数据存储器暴露一次性操作的结果 这是一个经典的操作模式,其中您会使用协程的结果来改变状态容器: △ 将一次性操作的结果暴露给可变的数据容器...liveData 协程构建器所使用的方法是 添加一个 5 秒钟的延迟,即如果等待 5 秒后仍然没有订阅者存在就终止协程。...Activity 和 Fragment 提供了若干协程构建器: Activity.lifecycleScope.launch : 立即启动协程,并且在本 Activity 销毁时结束协程。...Fragment.lifecycleScope.launch : 立即启动协程,并且在本 Fragment 销毁时结束协程。...它会在 lifecycleOwner 进入 X 状态之前一直等待,又在离开 X 状态时挂起协程。对此,需要注意对应的协程只有在它们的生命周期所有者被销毁时才会被取消。
△ 铺设管道 在 Android 应用中您可以简单地在每次需要时请求数据,例如我们可以使用挂起函数来实现在每次视图启动时向 ViewModel 请求数据,而后 ViewModel 又向数据层请求数据,接下来这一切又在相反的方向上发生...我们使用数据流构建器来创建数据流,因为 Flow 是在协程上下文环境中运行的,它以挂起代码块作为参数,这也意味着它能够调用挂起函数,我们可以在代码块中使用 while(true)来循环执行我们的逻辑。...在示例代码中,我们首先从 API 获取消息,然后使用 emit 挂起函数将结果添加到 Flow 中,这将挂起协程直到收集器接收到数据项,最后我们将协程挂起一段时间。...catch 运算符还可以在有需要的时候再次抛出异常或者发送新值,我们在示例代码中可以看到其在捕获到 IllegalArgumentExceptions 时将其重新抛出,并且在发生其他异常时发送一个空列表...在协程中我们将这种按需创建并且只有在被观察时才会发送数据的数据流称之为 冷流 (Cold Stream)。
ViewModel和View层的通信只依赖LiveData足够吗? 在使用MVVM架构时,数据变化驱动UI更新。...需要手动添加lifecycleObserver来保证线程的挂起和恢复,并且不支持协程。考虑使用kotlin协程中的Channel替代。...使用lifecycle-runtime-ktx库中的launchWhenX方法,对Channel的收集协程会在组件生命周期 < X时挂起,从而避免异常。...也可以使用repeatOnLifecycle(State) 来在UI层收集,当生命周期 < State时,会取消协程,恢复时再重新启动协程。...,如果想要Activity在非活跃状态下直接丢弃收到的事件,应该使用repeatOnLifecycle来控制协程的开启和取消而非挂起。
FlowEventBus 常用消息总线对比 image.png 设计构思 通过学习 从 LiveData 迁移到 Kotlin 数据流 得到思路: SharedFlow作为事件载体 : 优点: 依托协程轻松切换线程...依赖库版本 关键在于 kotlinx-coroutines > 1.4.x 和 lifecycle-runtime-ktx > 2.3.x API 以下示例中的Event均是随意定义的类,只是测试时为了区分事件而定义的名字...fragment,StickyEvent::class.java) removeStickyEvent(activity,StickyEvent::class.java) 原理 以上功能依托于Kotlin协程的...viewModelScope.launch { delay(time) flow.emit(value) } 有序分发 Flow本身就是有序的 全局单例 使用全局ViewModel,主要是因为有...ViewModelScope,可以避免使用GlobalScope,如果想要单页面内部组件通信,那就使用ActivityScope的ViewModel就行了: object ApplicationScopeViewModelProvider
在 ViewModel 中启动协程 既然 CoroutineScope 会追踪由它启动的所有协程,而 launch 会创建一个新的协程,那么您应该在什么地方调用 launch 并将其放在 scope 中呢...所以,当您需要将一个协程同 ViewModel 的生命周期保持一致时,使用 viewModelScope 来从常规函数切换到协程中。...协程失败时发出报错信号 在协程中,报错信号是通过抛出异常来发出的,就像我们平常写的函数一样。来自 suspend 函数的异常将通过 resume 重新抛给调用方来处理。...还记得我在一开始说的结构化并发是一系列编程语言特性和实践指南的集合,在 suspend 函数中引入无关联协程作用域违背了结构化并发规则。...下一步 本篇文章,我们探讨了如何在 Android 的 ViewModel 中启动协程,以及如何在代码中运用结构化并发,来让我们的代码更易于维护和理解。
start() } 运行效果如下: image.png 可以看到当设置延迟加载时,协程是start()后才开始执行 说到延迟加载,在总结一下协程启动模式 DEFAULT 模式 默认的 协程启动模式...,才在子线程中执行挂起函数 ; 如果在主线程中启动协程 , 则该模式的协程就会直接在主线程中执行 ; 如果在子线程中启动协程 , 则该模式的协程就会直接在子线程中执行 ; 协程异常处理 对于不同协程构造器...分别介绍 launch 和 async 情况下的异常处理 Launch launch 方式启动的协程,异常会在发生时立刻抛出,使用 try catch 就可以将协程中的异常捕获。...View的生命周期并不一致,需要让observer感知Fragment中的View的生命周期而非Fragment, ViewModel中使用协程 同样引入扩展库 implementation "androidx.lifecycle...:lifecycle-viewmodel-ktx:版本号" 引入库之后,我们就可以在ViewModel用viewModelScope来使用协程.
) 1 -> DiscoverPage () 2 -> HotPage () 3 -> PersonPage () } } 使用记忆的协程作用域可以确保在组件重新合成时...,用于在协程中执行副作用操作。...它会自动在适当的时间启动和取消协程,确保在 Compose 组件的生命周期内正确处理副作用。当组件被创建时,LaunchedEffect 会启动协程,当组件被销毁时,它会自动取消协程。...总结起来,LaunchedEffect 是一个用于在协程中执行副作用操作的函数,它确保在 Compose 组件的生命周期内正确处理副作用。...然后使用 cachedIn () 函数,将流缓存在 viewModelScope 中,以便在组件重新合成时保留数据状态。
如果您不了解协程,这里有一系列很棒的博客《在 Android 开发中使用协程》以及 codelab: 在 Android 应用中使用 Kotlin 协程以供参考。...() } 复制代码 这段示例代码只启动了一个协程,但我们在真实的使用环境下很容易创建出许多协程,这就难免会导致有些协程的状态无法被跟踪。...而在 ViewModel 中,我们可以使用 viewModelScope 来管理协程的作用域。...这样一来,只要您使用了 ViewModel,您就可以使用 viewModelScope 在 ViewModel 中启动各种协程,而不用担心任务泄漏。...根据 LiveData 自动更新; 在 ViewModel 中使用 Kotlin 协程时,使用 viewModelScope 来让协程在 ViewModel 被销毁时自动取消。
如果您不了解协程,这里有一系列很棒的博客《在 Android 开发中使用协程》以及 codelab: 在 Android 应用中使用 Kotlin 协程以供参考。...() } 这段示例代码只启动了一个协程,但我们在真实的使用环境下很容易创建出许多协程,这就难免会导致有些协程的状态无法被跟踪。...而在 ViewModel 中,我们可以使用 viewModelScope 来管理协程的作用域。...这样一来,只要您使用了 ViewModel,您就可以使用 viewModelScope 在 ViewModel 中启动各种协程,而不用担心任务泄漏。...根据 LiveData 自动更新; 在 ViewModel 中使用 Kotlin 协程时,使用 viewModelScope 来让协程在 ViewModel 被销毁时自动取消。
viewModelScope 对结构化并发 的贡献在于将一项扩展属性加入到 ViewModel 类中,从而在 ViewModel 销毁时自动地取消子协程。...当你在 ViewModel 中运行协程的时候这一点尤其重要。如果你的 ViewModel 即将被销毁,那么它所有的异步工作也必须被停止。否则,你将浪费资源并有可能泄漏内存。...此作用域中创建的协程将会在 ViewModel 使用期间一直存在。...销毁时后台运行的繁重操作会被取消,因为对应的协程是由这个 uiScope 启动的。...学习一下怎样在 Android 应用中使用协程吧。
AndroidX Lifecycle v2.1.0 在 ViewModel 中引入 viewModelScope,当 ViewModel 被销毁时它会自动取消协程任务,这个特性真的好用。...本文介绍 viewModelScope 使用和内部实现方式,分析 ViewModel 是如何自动取消协程的。...ViewModel 引入协程 当我们在 ViewModel 里面需要引入协程,首先要在 ViewModel 中新建一个 CoroutineScope, 用来管理所有协程任务,同时需要 onCleared...viewModelScope 方式 注意 lifecycle-viewmodel-ktx 版本号: 2.1.0-beta01 viewModelScope 管理协程的方式与我们在 ViewModel 引入协程的方式一样...ViewModel 被销毁时内部会执行 clear() 方法,在 clear() 方法中遍历调用 closeWithRuntimeException 取消了 viewModelScope 的协程,实现流程非常清晰
viewModelScope 对结构化并发 的贡献在于将一项扩展属性加入到 ViewModel 类中,从而在 ViewModel 销毁时自动地取消子协程。...当你在 ViewModel 中运行协程的时候这一点尤其重要。如果你的 ViewModel 即将被销毁,那么它所有的异步工作也必须被停止。否则,你将浪费资源并有可能泄漏内存。...此作用域中创建的协程将会在 ViewModel 使用期间一直存在。...销毁时后台运行的繁重操作会被取消,因为对应的协程是由这个 uiScope 启动的。...学习一下怎样在 Android 应用中使用协程吧。 文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。
协程到目前为止没有一个具体的定义,但很多语言都有协程,但每个语言又有所不同,官方说协程基于线程,是轻量级的线程。在我看来,协程是一种趋势,它让我们从繁琐的多线程中释放出来,提高我们的编写代码的效率。...协程更像是一个管理者的秘书,它让我们从复杂的逻辑中得到解放,只需要告诉秘书执行流程,其他的都交由秘书安排 以上就是我对协程的理解,接下来来学习如何使用kotlin的协程 一、实现异步任务相同功能 如果说我们有一个耗时操作...三、调度器 所有的协程必须运行在调度器中,也就是我们之前代码指定的Dispatchers,即使在主线程也是如此 官方提供的调度器为以下三种: 调度器 四、协程的两部分 kotlin的协程实现分为两个层次...,我们之前使用的都是业务框架层 1.基础设施层,标准库的协程API,主要对协程提供了概念和语义上最基本的支持 2.业务框架层,协程的上层框架支持 基础设施写法: fun main() { val...销毁,协程还是会运行 2.MainScope:在Activity中使用,可以在onDestroy中取消 3.ViewModelScope:只能在ViewModel中使用,绑定ViewModel的生命周期
在之前的Flow,collect函数浅析和仿Flow构建器创建数据流文章中我们探索了flow的简单使用及它的简单原理,但是生产过程中我们往往会借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了...接下来开始看下这几个Flow的特殊之处和应用场景吧~~官方推荐的Flow数据流流向:数据流程数据流包含三个实体:提供方会生成添加到数据流中的数据。得益于协程,数据流还可以异步生成数据。...:跟随ViewModel的生命周期变化,当ViewModel观察的组件销毁调用onClear的时候自动取消协程,生命周期过长不采取一般在对数据进行处理的时候会使用2.lifecycleScope: 此范围内启动的协程会在...一定要注意取消这个词和挂起的区别,挂起其实还是有订阅关系的当flow发射时还是会收到走collect上游并没有取消,但是取消就是协程作用域的取消collect函数不会执行了。...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候在开启一个新协程(也即会重新执行collect函数是新的订阅者)。
领取专属 10元无门槛券
手把手带您无忧上云