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

为什么Ktor发布请求冻结应用程序,但Get不冻结它?

Ktor是一个用于构建异步服务器和客户端应用的框架,它基于Kotlin协程。在Ktor中,你可以使用suspend关键字来标记一个函数为挂起函数,这意味着这个函数可以在执行过程中暂停并在稍后恢复执行,而不会阻塞线程。

基础概念

  • 挂起函数(Suspending Functions):在Kotlin中,挂起函数是一种特殊类型的函数,它可以在执行过程中挂起并在稍后恢复,而不是阻塞当前线程。这对于处理I/O操作(如网络请求)非常有用,因为它可以提高应用程序的响应性和吞吐量。
  • 冻结(Freezing):在某些情况下,如果一个挂起函数在主线程上被调用,而没有适当的并发控制,它可能会导致应用程序冻结或无响应。

为什么Ktor发布请求冻结应用程序?

当你使用Ktor进行HTTP请求时,如果你在主线程上直接调用挂起函数,而没有使用协程作用域(CoroutineScope),那么这个请求可能会阻塞主线程,导致应用程序冻结。

为什么Get不冻结它?

Get通常指的是Ktor中的路由处理函数,它们默认是挂起函数。如果你正确地使用了协程作用域来调用这些函数,它们不会阻塞主线程。例如:

代码语言:txt
复制
routing {
    get("/") {
        // 这里是挂起函数体
        call.respondText("Hello, world!")
    }
}

在这个例子中,get路由处理函数是一个挂起函数,它会在Ktor的协程作用域内执行,因此不会阻塞主线程。

解决方法

为了避免应用程序冻结,你应该确保所有的挂起操作都在适当的协程作用域内执行。你可以使用launchasync来启动新的协程,并在其中执行挂起操作。例如:

代码语言:txt
复制
import kotlinx.coroutines.*
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.module() {
    routing {
        get("/") {
            // 使用协程作用域来执行挂起操作
            GlobalScope.launch {
                // 这里是挂起操作
                delay(1000) // 模拟耗时操作
                call.respondText("Hello, world!")
            }
        }
    }
}

在这个例子中,我们使用GlobalScope.launch来启动一个新的协程,并在其中执行耗时操作。这样,即使这个操作需要较长时间来完成,它也不会阻塞主线程。

参考链接

请注意,虽然GlobalScope可以用来启动协程,但在实际应用中,通常建议使用更具体的作用域,如CoroutineScope(Dispatchers.Default)或自定义的作用域,以便更好地控制协程的生命周期和调度。

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

相关·内容

【Web技术】850- 深入了解页面生命周期API

同时,每一个标签页都会消耗系统资源,比如内存和CPU。 由于不可能限制用户打开新的浏览器标签页并将其留下,因此浏览器采取了一些措施,以在浏览器标签页活动时重新分配资源。...PASSIVE - 页面可见,没有输入焦点。 HIDDEN - 页面不可见(也没有冻结)。 TERMINATED - 页面被卸载并从内存中清除。 你可以通过看下图找到生命周期状态和过渡的细节。...任何UI阻塞任务都应该被去掉优先级,比如同步和阻塞网络请求。 PASSIVE状态--即使用户在这个阶段没有与页面进行交互,他们仍然可以看到。因此你的网页应该流畅地运行所有的UI更新和动画。...Discarded状态 - 这个状态是应用程序无法观察到的。因此,任何可能的丢弃的准备工作都应该在隐藏或冻结状态下进行。...浏览器兼容性 一些旧的浏览器不具备检测其网页何时被冻结或丢弃的能力。不过,随着Chrome 68的发布,也加入了预测网页下一步状态的能力。

1.3K20

Kotlin 异步框架 Ktor 2.0 发布,提供新的插件特性

作者 | Andrea Messetti 译者 | 平川 策划 | 丁晓昀 Ktor 是一个用于创建异步客户端和服务器应用程序的 Kotlin 框架。...在服务器端,Ktor 2.0 引入了名为“插件(Plugins)”的新特性(以前被称为“Features”),以提高框架的可扩展性。顾名思义,允许我们实现插件架构,简化了功能扩展。...在客户端,Ktor 2.0 带来了一个经过简化的 API,用于管理常见的 HTTP 请求;响应现在是HttpResponse类型,可以简单地使用 bodyAsText 访问响应体。...HTTP 请求时回复“Hello, world”。...要进一步了解如何使用 Ktor 创建基于微服务的应用,可以阅读 JetBrains 开发宣传副总裁 Hadi Hariri 在 InfoQ 上发布的这篇教程。

1K30
  • Java微框架的兴起,流行微服务框架点评

    早期的例子之一是来自Ruby(2007)的Sinatra,激发了相当多的Java微框架。我相信有些读者会熟悉甚至更早的例子-如果你是,请在评论区给我留言! 为什么微框架越来越流行?...Javalin是在Kotlin编写的,支持Java和Kotlin。如果您想编写一个漂亮的REST API,那么Javalin是一种乐趣。 Javalin正在积极开发中,每隔几周就会发布新版本。...ktor 易于使用,有趣和异步。 不是Java,而是Kotlin微框架。Ktor是由JetBrains公司赞助和开发的,JetBrains是Kotlin的创造者,致力于使开发变得简单和有趣。...我还没有机会测试,但是基于Kotlin爱好者和JetBrains的支持,值得一提。 Ktor还没有发布1.0.0版本,但应该是在今年的某个时候。...我需要的不仅仅是一个微框架 如果你需要一些轻量级,功能齐全的东西,我可以推荐两个主要的选择: Spring Boot - Spring Boot使创建基于生产级的独立的Spring应用程序变得容易,您可以

    2.6K41

    只会用 Spring Boot 创建微服务?那你就 OUT 了,还有这 4 种替代方案!

    Ktor的模块是一个用户定义的函数,接受一个 Application类型的对象,可以配置流水线、注册路由、处理请求等: fun Application.module() {     val applicationInfoService...微服务 程序大小(MB) Helidon服务 17,3 Ktor服务 22,4 Micronaut 服务 17,1 Quarkus服务 24,4 Spring Boot服务 45,2 启动时长 每个应用程序的启动时长都是固定的...500 个用户 * 1000 个的请求 堆内存只是为应用程序分配的总内存的一部分。...但是,我们不要忘记,Spring Boot 一是在不断改进,二是拥有庞大的生态系统,并且有相当多的 Java 程序员熟悉。...23 种设计模式实战(很全) Nacos 2.1.1 正式发布,真心强! Spring Cloud 最新版发布,追不动了。。 面试通过,背调凉了。。

    6.2K20

    Ktor库的高级用法:代理服务器与JSON处理

    在现代网络编程中,Ktor是一个高性能且易于使用的框架,提供了对异步编程、WebSockets、HTTP客户端和服务器等特性的原生支持。...这可能是由于网络策略的限制,或者是为了提高网络请求的安全性和隐私保护。Ktor提供了代理服务器的支持,使得配置和使用代理变得非常简单。...然后,我们创建了一个getUser函数,使用HttpClient发送一个GET请求到指定的URL,并期望返回一个User对象。...然后,我们使用HttpClient发送一个GET请求到指定的URL,并处理返回的JSON响应。结论Ktor是一个功能强大且灵活的网络编程框架,提供了对代理服务器和JSON数据处理的原生支持。...通过本文的介绍,你应该能够理解如何在Ktor中配置代理服务器以及如何处理JSON数据。这些高级用法将帮助你构建更加强大和灵活的网络应用程序

    19010

    Python 2 vs Python 3,究竟谁是性能之王?

    本文将介绍这次史无前例的 Python 3 转换的计划、执行和发布过程。 为什么选择 Python 3? Python 3 的接受度在 Python 社区一直是热门话题。...这个版本微软已经不再支持了,也与 Windows 10 SDK 兼容。 冻结和脚本 当初,我们依靠“冻结”脚本为我们支持的每个平台创建原生应用程序。...并不只是个 API,而是个完整的应用程序包(.appex),有自己的生存中崛起规则(即由 OS 启动),而且对于进程间通信的要求更严格。...关于 pyinstaller 的一点:我们认真地思考过在项目早期使用 pyinstaller,当时它不支持 Python 3,而且更重要的是,和其他冻结脚本有类似的限制。...我们不能简单地在某次发布中“改变一个开关”来实现转换,特别是我们的发布过程要求每两个星期给所有用户发布一个新版本。

    1.8K20

    只会用 Spring Boot 创建微服务?这 4 种替代方案绝了!

    Ktor的模块是一个用户定义的函数,接受一个 Application类型的对象,可以配置流水线、注册路由、处理请求等: fun Application.module() { val applicationInfoService...不同微服务框架对比 不同微服务框架的新版本发布后,下面的结果可能会有变化;你可以使用此GitHub项目自行检查最新的对比结果 。...图片 启动时长 每个应用程序的启动时长都是固定的: 图片 值得注意的是,如果你将 Spring Boot 中不必要的依赖排除,并注意设置应用的启动参数(例如,只扫描必要的包并使用 bean 的延迟初始化...500 个用户 * 1000 个的请求 堆内存只是为应用程序分配的总内存的一部分。...但是,我们不要忘记,Spring Boot 一是在不断改进,二是拥有庞大的生态系统,并且有相当多的 Java 程序员熟悉

    19710

    只会用 Spring Boot 创建微服务?这 4 种替代方案了解一下!

    (在Consul中注册,通过客户端负载均衡的名称请求另一个微服务的HTTP API) 构建一个 uber-JAR 先决条件 JDK 13 Consul 从头开始创建应用程序 要基于其中一个框架上生成新项目...Ktor的模块是一个用户定义的函数,接受一个 Application类型的对象,可以配置流水线、注册路由、处理请求等: fun Application.module() {       val applicationInfoService...图片 启动时长 每个应用程序的启动时长都是固定的: 图片 值得注意的是,如果你将 Spring Boot 中不必要的依赖排除,并注意设置应用的启动参数(例如,只扫描必要的包并使用 bean 的延迟初始化...500 个用户 * 1000 个的请求 堆内存只是为应用程序分配的总内存的一部分。...但是,我们不要忘记,Spring Boot 一是在不断改进,二是拥有庞大的生态系统,并且有相当多的 Java 程序员熟悉

    2.4K40

    Kubernetes 1.30的命名更好了

    限制了应用程序根据其配置文件对系统执行的操作。 用户通过 API 指定 AppArmor 配置文件。 该增强提案已提出约三年。权限强制执行是一项艰巨的任务。...没有弃用任何值得注意的功能,并且带来了一些非常及时的安全增强功能。总体而言,v1.30 带来了 45 项增强功能——17 项稳定,18 项为 Beta,10 项为 Alpha。...在最近一轮中,95 个 KEP 进入了增强冻结期,只有 45 个进入了代码冻结期。 Cosgrove 说:“在增强冻结期,人们对自己完成某项工作的能力非常乐观。这没关系,这完全正常。”...“然后我们在代码冻结期面对现实。” 在此整个时间范围内已完成测试,并且还可能发布了即将发布版本的几个 Alpha 和 Beta 版本(这些版本并未得到广泛使用)。因此,候选版本将在不久后开始发布。...这是另一个用于更好地扩展资源的功能,动态资源分配提供了一个 API,用于在 Pod 和 Pod 内的容器之间请求和共享资源。

    11510

    KMM跨平台开发入门,看这一篇就够了~

    他们的成就主要都是在UI上跨平台,当然Flutter虽然可以处理一些公共的业务逻辑,目前在业务较重的情况下仍然需要各自处理。  ...而KMM却与之相反,接下来让我们来一起了解一下吧~ 什么是KMM KMM 即 Kotlin Multiplatform Mobile 是一个 SDK,旨在简化跨平台移动应用程序的开发。...通过KMM开发者可以在 iOS 和 Android 应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。 ...首先我们将用到依赖添加进来,这里主要有Kotlin协程、序列化(Ktor使用要求)、和KtorKtor是一个可以用于HTTP请求的网络框架,如果读者不熟悉的话可自行查看。代码如下所示。  ...     */     suspend fun getData(): String {         val rockets: DemoReqData =             httpClient.get

    4.5K20

    Compose也能开发iOS了,快来体验~

    同时Kotlin也表示将在2023年发布KMM的稳定版本。 届时Compose-jb + KMM 将实现Kotlin全平台。...果然,运行不知道,一运行吓一跳 这个问题困扰了我两三天,实在是无从下手,毕竟现在相关的资料很少,经过N次的搜索,最终解决的方案很简单:Kotlin版本升级至1.8.0就可以了。...添加网络请求配置 首先在shared模块下的build文件中添加网络请求相关的配置,这里网络请求我们使用Ktor,具体的可参照之前的文章:KMM的初次尝试~ 配置代码如下所示: val commonMain...get(it)) } } } } 获取数据后,通过 Message方法 将数据展示出来,这里只将作者与标题内容显示出来,代码如下所示。...而Compose for iOS何时发布,我想也是指日可待的事情。

    1.4K30

    Compose跨平台第一弹:体验Compose for Desktop

    这并不是这里的重点。 添加退出弹窗 当我们点击左上角(macOS)的X号时,应用程序就直接退出了,这是因为在Window函数中指定了退出事件,再来看一下这部分代码,如下所示。...运行程序,点击X号,弹出退出确认弹窗,点击确定,应用程序将退出。效果如下图所示。...实现一个网络请求功能 在 Kotlin 跨平台开发入门 中我们借用「wanandroid」中「每日一问」接口实现了一个网络请求,现在我们将这部分功能移植到Desktop程序中,网络请求框架仍然使用Ktor...get(it))             }         }     } } 获取数据后,通过Message方法将数据展示出来,这里只将作者与标题内容显示出来,代码如下所示。...title}")         }     } } 运行程序,点击“请求数据”,结果如下图所示。 这样我们就实现了一个简单的桌面端数据请求与显示功能。

    2.4K30

    干货 | 携程机票 App KMM 跨端生产实践

    此外 Kotlin 中表示二进制数据的 ByteArray 与 Java 中的 byte[] 是完全等价的,与 Objective-C 的 NSData兼容,在 iOS 端的处理上还需要对 ByteArray...3)冻结对象,冻结对象可以在任意线程访问,冻结对象不可进行“写”操作,一进行“写”操作立刻 crash,且冻结对象不可解冻。...我们的方案虽然能暂时解决这个问题,问题的源头还是在于官方的设计上,自 Kotlin/Native 诞生之初便由来已久,也一直为人所诟病。...社区并不认可官方这套为何设计对象子图机制的说辞,社区普遍认为 Kotlin/Native 仓促发布,研发团队一时间造不出一个能在多线程环境下高效稳定内存泄漏的 GC 系统才出此下策。...Ktor 与 kotlinx 库等官方库是目前 Kotlin 跨平台的中坚力量,Ktor 目前可以在多平台环境提供稳定的 HTTP 请求、数据序列化/反序列化功能,是相当强大的 Kotlin 多平台网络库

    3.5K10

    如何正确地在Android手机上安装国产软件?

    Xposed Xposed简单来说是一个框架,它可以不修改APK的情况下改变系统和应用程序的行为,所有的更改都在内存中。...Android平台的应用程序分为七个优先级:前台进程、可见进程、主要服务、次要服务、后台进程、内容供应节点、空进程。...的原理非常简单,adb中提供了一个adb shell pm disable命令,在root权限下可以直接用来冻结app,而冰箱基本可以理解为使用了adb shell pm disable命令。...不过提供了非常方便的launcher,让你能够快速地启动冻结app。 保护隐私方面,对于已经Root的手机,可以使用AppOps应用控制应用权限。...左图为 通过系统权限管理拒绝微信读取设备ID,右图为 通过AppOps忽略微信读取设备ID请求 未Root 未Root手机其实本文的重点。笔者自从去年入手了S7 edge后就一直纠结于是否Root。

    3.7K70

    穿越26年的低代码框架

    由于专注于工业制造和控制领域,通过对业务的梳理,很容易识别出冻结点和热点。...典型的加工逻辑冻结点是单元控制软件并发地执行所有工作站上的加工序列。加工序列本质上是可变的,组成加工序列的加工控制对象,以及对象要执行的命令却是不变的。...对于策略基类和子类而言,虽说执行物料流动和零件加工的任务是热点,因为不同加工任务有着不同的物料流动和零件加工序列,抽象出来的ProcessingStrategy又表现了加工序列的共性,是不变的特征,又可以视为冻结点...然而,策略类是对行为的抽象,自身是无状态的,不应该了解这些信息。...策略子类的process方法封装的是加工序列,在已有命令类的基础上,加工序列可能只是对原子任务和组合任务的组装,排除以配置方式实现的可能性。

    40810

    javassist编程指南==读、写字节码

    根据构造一个CtClass对象的需求读取一个class文件,并记录被构建好的对象以供将来进行访问。...如果CtClass对象没有找到,get()方法会读取class文件去构造一个CtClass对象,记录在哈希表中然后作为get()的返回值返回。...冻结类Frozen class 冻结类的含义 如果一个CtClass对象通过writeFile()、doBytecode、toClass方法被转换到class文件中,javassist则会冻结这个CtClass...如果一个程序运行在一个web应用程序比如JBoss、Tomcat中,ClassPool对象则可能搜索步到用户的类,因为web应用使用了多个类加载器。...例如:加载一个org.javassist.test.Main类,的class文件是: http://www.javassist.org:80/java/org/javassist/test/Main.class

    40910

    语言模型的冰山一角:微调是不必要, AI21 Labs探索冻结模型未开发潜力

    每种方法的计算成本都高于现有的冻结模型方法,相对于单次通过一个巨大的冻结 LM 仍然可以忽略不计。...ID-PT 架构如图 2 所示,由 3 个组件组成:(1)冻结基于 T5 的编码器;(2) 一个学习提示,用于在提示生成器中提示调优冻结 T5 编码器的功能(总共 330K 学习参数);(3) 一个学习的交叉注意力网络...虽然检索器相关性分数是根据问题和段落的单独密集表示来计算的,重排序器会在联合处理问题和文章后预测每个文档的相关性分数。提示调优冻结的 LM 以从出现在其上下文中的重排序的文档中提取答案。...将循环应用于冻结 LM 模型 现有的基于 Transformer 的 LM 的应用程序只通过 LM 运行一次给定输入。...如果一个 LM 在某项任务上的表现令人满意,现有的垂直性能改进就是预训练一个更大的 LM。然而,预训练越来越大的 LM 很快就变得昂贵起来,而且即使在评估时间部署巨大的模型也是昂贵的。

    69030

    解决 iOS 15 上 APP 莫名其妙地退出登录 解决 iOS 15 上 APP 莫名其妙地退出登录

    我们没有视频,也没有具体的步骤来重现这个问题,所以我努力尝试以各种方式启动应用程序,希望能亲眼看到。...是什么发生了改变以及为什么如此难以复现? 是什么发生了改变以及为什么如此难以复现? 我粗略地看了一下发布说明,在谷歌上快速搜索了一下,我找不到任何东西,所以我不得不继续挖掘以更好地了解这个问题。...我们实行了每周一次的发布计划,多亏了大量的自动化。此时,我们即将发布的下一个截止点(代码冻结)是在第二天。...因为我们还没有完全了解这个问题有多普遍,而且我们也不确定是否能够在代码冻结发布一个修复程序,所以我利用这个机会通过使用Crashlytics(崩溃日志记录工具) 增加一些额外的非致命性日志来解决缺乏可观察性的问题...我在这里学到了重要的一课,即我不应该假设受保护的数据在AppDelegate初始化时是可用的,说实话,我还是不高兴,因为我不明白为什么它不可用。

    1.6K20

    更新MacOS BigSur是遇到的常见问题及解决方案

    检查您的下载文件夹和应用程序文件夹。找到后,将其拖到废纸,,将其清空,重新启动Mac,然后重试。...macOS Big Sur冻结 您的Mac在升级后死机了吗?您的应用程序和程序实际上可能是macOS Big Sur冻结的原因。 要退出无响应的应用程序,请按Command-Option-Esc。...单击使您的macOS冻结应用程序(通常不会响应),然后按强制退出。 如果问题仍然存在,运行CleanMyMac X可以帮助解决性能问题,包括冻结。这是使Mac快速恢复正常的方法: 。...检查电源-这听起来很简单,这就是为什么位于列表顶部。如果您使用的是笔记本电脑,请将其插入充电器。如果已经插入,请确保在墙上和Mac上的连接都牢固。如果使用台式机Mac,请确保电源线牢固。...禁用了苹果的Gatekeeper,后者无法验证应用程序。如果再次遇到类似的问题,请首先检查Apple服务器是否一切正常。将软件更新最新版本。

    5.5K20
    领券