当前位置: 首页 > news >正文

Kotlin协程Semaphore withPermit约束并发任务数量

Kotlin协程Semaphore withPermit约束并发任务数量

 

 

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingfun main() {val permits = 1 //注意观察1,2,3时候并发跑出来的任务状况val semaphore = Semaphore(permits)runBlocking {launch {myfun("a", semaphore)}launch {myfun("b", semaphore)}launch {myfun("c", semaphore)}println("启动完毕")delay(5000)}
}private suspend fun myfun(tag: String? = null, semaphore: Semaphore) {val start = System.currentTimeMillis()println("$tag start @$start")semaphore.withPermit {withTimeout(5000) {runInterruptible {runBlocking {delay(1000)}}}}val end = System.currentTimeMillis()println("$tag end 耗时=${end - start} @$end")
}

1、当 permits = 1

启动完毕
a start @1744097960395
b start @1744097960406
c start @1744097960411
a end 耗时=1026 @1744097961421
b end 耗时=2023 @1744097962429
c end 耗时=3019 @1744097963430

 

 

 

2、当 permits = 2

启动完毕
a start @1744097988824
b start @1744097988833
c start @1744097988834
b end 耗时=1016 @1744097989849
a end 耗时=1025 @1744097989849
c end 耗时=2024 @1744097990858

 

 

3、当 permits = 3

启动完毕
a start @1744098013438
b start @1744098013450
c start @1744098013450
c end 耗时=1007 @1744098014457
b end 耗时=1007 @1744098014457
a end 耗时=1019 @1744098014457

 

简单的说,Semaphore的permits约束了同时并发的协程任务数量。当并发任务数量超过permits后,多出来的任务就要等待permits数量内的任务完成后、空出余量才能投入运行。

 

 

Kotlin协程runBlocking并发launch,Semaphore同步1个launch任务运行_kotlin launch仅运行一次-CSDN博客文章浏览阅读1.1k次。本文介绍了如何使用Kotlin的协程和Semaphore进行并发控制,确保在并发环境中A、B、C三个任务按照顺序运行,即使引入Java版Semaphore也会有不同表现。 https://blog.csdn.net/zhangphil/article/details/132356885

新Java线程Semaphore:并行环境下访问竞争资源控制_并发进程竞争资源如何进行控制-CSDN博客文章浏览阅读585次。本文介绍Java 1.5引入的Semaphore类,用于多线程环境下资源访问控制。通过实例展示如何设置许可证数量,控制线程并发访问,确保资源访问的同步与互斥。 https://blog.csdn.net/zhangphil/article/details/83410270

 

相关文章:

  • 华为仓颉智能体开发框架 Cangjie Magic深度解析
  • AI绘制流程图,方法概述
  • 解锁C++ gRPC:快速入门指南
  • Flutter Notes | 我用到的一些插件整理
  • java的lambda和stream流操作
  • 麦科信汽车诊断示波器在机车维修领域中的应用实例
  • Sqlite3交叉编译全过程
  • 使用pnpm第一次运行项目报错 ERR_PNPM_NO_PKG_MANIFEST No package.json found in E:\
  • Java拼团项目
  • AI——K近邻算法
  • JESD204B标准及其在高速AD采集系统中的应用详解
  • Ubuntu 修改语言报错Failed to download repository information
  • 从Archery到NineData:积加科技驱动数据库研发效能与数据安全双升级
  • DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_自定义单元格大小示例(CalendarView01_07)
  • ASP.NET 中 OAuth 2.0/OpenID Connect 深度集成指南
  • “AI问诊助手”落地武汉市中心医院,深兰科技助力医疗数智化升级
  • eplan许可证无法识别硬件信息
  • 利用DeepSeek设计一个HTML批量转换工具设计
  • CrewAI Community Version(一)——初步了解以及QuickStart样例
  • 实战篇|多总线网关搭建与量产验证(5000 字深度指南)
  • 肖扬任武钢集团董事长、党委书记
  • “80后”保利文化集团董事长王波挂职哈尔滨副市长,负责文旅、招商
  • 山东省淄博市委原常委宋振波被“双开”
  • 伊朗外长访华将会见哪些人?讨论哪些议题?外交部回应
  • 著名世界语教育家、翻译家魏以达逝世
  • 《上海国际金融中心进一步提升跨境金融服务便利化行动方案》印发