首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏韩曙亮的移动开发专栏

    【Kotlin 底层实现 ② ( 调度器 | 任务泄漏 | 结构化并发 )

    文章目录 一、调度器 二、任务泄漏 三、结构化并发 一、调度器 ---- 是在 调度器 中运行的 , 在中有 3 种调度器 : Dispatchers.Main 调度器 : 在 主线程 Dispatchers.Default 调度器 都是在子线程 中执行耗时任务 , 但是在取消任务方面 , 磁盘或网络操作 与 CPU 密集型操作 是不同的 , 需要采用不同的任务取消策略 , 因此这里将耗时任务分配成两种调度器 ; 二、任务泄漏 ---- 任务泄漏 : 发起 任务 后 , 无法追踪任务的执行结果 , 任务等于无效任务 , 但是仍然会消耗 内存 , CPU , 网络 , 磁盘 等资源 ; Kotlin 中引入了 结构化并发机制 避免 任务泄漏 的情况发生 ; 任务泄漏 与 内存泄漏 类似 ; 三、结构化并发 ---- 结构化并发 使用场景 : 任务取消 : 在不需要任务的时候 , 取消协任务 ; 追踪任务 任务 , CoroutineScope 作用域 可以取消 所有由其启动的任务 ; 常见的 CoroutineScope 作用域 : GlobalScope : 该作用域是 进程级别的

    1.1K20编辑于 2023-03-30
  • 来自专栏Golang实战进阶

    Go-使用和泄漏

    ,这就出现了泄漏;特点是:应用程序的生命周期内存在,为goroutine分配的任何内存都不能释放go泄漏的情况1.没有发送者,导致始终等待首先go是“通过channel来共享内存”,而无缓冲的channel ch中读取数据val := <-ch // 当ch中被填入数据后,触发同步操作,否则该会始终阻塞在这里fmt.Println(val)}()}上面的例子中由于该始终阻塞且无法释放,导致该泄漏如果在某个函数中需要顺序调用另一个函数 即go泄漏发生go泄漏的情况:当go中的发送到无缓冲通道中时,要在接收者接收之前都会进行阻塞,但是当出现超时的情况时,则select则会通过ctx.Done()的方式结束,使得接收器停止接收 ,而导致go始终处于阻塞状态,就发生了go泄漏修复方法:准备一些空间,将无缓冲的通道改为容量cap为1的有缓冲通道ch := make(chan result,1)这样操作后,即使在超时的情况下发送者所在的中仍然可以将 search函数返回的result放到ch中然后结束,从而使得该的内存以及通道ch的内存被回收掉,避免了泄漏2.不完整的工作如下例子中,因为main函数其实在go语言中也是作为一个(主

    43310编辑于 2024-08-25
  • 来自专栏程序员奇点

    Go tool 问题排查- 泄漏问题

    和 Java 有点类似,自带了内存回收, 所以一般不会发生内存泄漏。 但是也不绝对, golang 中 本身是可能泄漏的,或者叫做失控,进而导致内存泄漏。 启动程序 为了能更加图形化的展示,可以安装。 (*Wolf).Drink 在不停地创建没有实际作用的: func (w *Wolf) Drink() { log.Println(w.Name(), "drink") for i := 0; i < 10; i++ { go func() { time.Sleep(30 * time.Second) }() } } 可以看到 Drink 函数 ,每次循环会有创建10个会 sleep 30s 才会退出,如果反复调用这个 Drink 函数, 那么会导致大量出现泄漏数会增加。

    2.3K20发布于 2021-09-15
  • 来自专栏Bennyhuo

    破解 Kotlin (3) - 调度篇

    关键词:Kotlin 异步编程 上一篇我们知道了启动的几种模式,也通过示例认识了 launch 启动的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示的奥义。 ? 1. 上下文 调度器本质上就是一个上下文的实现,我们先来介绍下上下文。 它拦截的方法也很简单,因为的本质就是回调 + “黑魔法”,而这个回调就是被拦截的 Continuation 了。 上一篇文章我们提到了 suspend main 会启动一个,我们示例中的都是它的子,可是这个最外层的到底是怎么来的呢? 小结 在这篇文章当中,我们介绍了上下文,介绍了拦截器,进而最终引出了我们的调度器,截止目前,我们还有异常处理、取消、Anko 对的支持等话题没有讲到,如果大家有相关想了解的话题,可以留言哈

    1K20发布于 2020-02-20
  • 来自专栏厉害了程序员

    python3:用仿真实验学习

    前两篇我们已经介绍了python 的使用和yield from 的原理,这一篇,我们用一个例子来揭示如何使用在单线程中管理并发活动。 是不是想到了恰好为实现离散事件仿真提供了合理的抽象。 第一门面向对象的语音 Simula 引入这个概念就是为了支持仿真。 : next(taxi) # 预激 Out[3]: Event(time=0, proc=13, action='leave garage')# 发送当前时间 在控制台中,变量_绑定的是前一个结果 我们会看到,做面向事件编程时,会不断把控制权让步给主循环,激活并向前运行其他,从而执行各个并发活动。 一种协作式多任务:显式自主的把控制权让步给中央调度程序。 调度程序可以在任何时刻暂停线程,把控制权交给其他线程 前两篇文章 python 1:10分钟入门 python 2:yield from 从入门到精通 再次说明一下,这几篇是《流畅的python

    1.3K30发布于 2020-12-25
  • 来自专栏飞鸟的专栏

    十、python学习笔记--爬虫(对比和非效率)

    # 一个简单的小爬虫,将3个页面的数据保存到data.html,对比和非的使用时间 """ 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过gevent.joinal执行 (会在IO阻塞处切换),用时短 4、在Windows系统,由于捕获IO较慢。

    1K31编辑于 2022-02-10
  • 来自专栏韩曙亮的移动开发专栏

    【Kotlin 简介 ( 概念 | 作用 | 创建 Android 工程并进行相关配置开发 | 异步任务与对比 )

    文章目录 一、概念 二、作用 三、创建 Android 工程并进行相关配置 1、创建 Android 工程 2、配置环境 3、布局文件 4、异步任务代码示例 5、代码示例 6、完整代码示例 四、异步任务与对比 一、概念 ---- Coroutine 是 Kotlin 语言 中新出现的概念 , 在 Java 语言中没有 ; 是 基于 线程 的 , 是 轻量级 线程 ; 二、作用 ---- 主要作用如下 : 处理耗时任务 : 耗时任务 通常需要 阻塞主线程 , 线程量级太重 , 耗时任务 推荐在中执行 ; 保证主线程安全 : 从主线程中 安全地调用可能会挂起的函数 包下的 Executor,ThreadPoolExecutor,FutureTask 取代 AsyncTask ; 三、创建 Android 工程并进行相关配置 ---- 1、创建 Android RC-native-mt' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC-native-mt' } 3

    6.2K20编辑于 2023-03-30
  • 来自专栏源码阅读

    -无栈(下)

    里面含有lc_t类型成员变量,本质上是一个unsigned short类型     ·整个PT,在创建之前需要调用PT_INIT进行初始化,初始化之后调用PT_BEGIN拉起运行完毕之后调用 ,一个是timer_thread定时,一个是login_thread登录; ·其中timer_thread负责定时器任务,network_thread负责消息接收并根据消息头拉起对应的登录 ); ·当读到消息之后,对于未开启流程的玩家创建一个,其他的则调度对应的(PT_SCHEDULE(login_thread(role_iter->second)))继续往后走; ·对于登录 ,而外层用name->RoleData的映射关系管理及其他中间态数据;     需要注意的是——以protothread来说: ·对于无栈来说,因为不存在指针等信息,所以无栈的所有信息是可以缓存在共享内存的 ,因此进程可以通过共享内存在重启的环境下,也不会导致中断; ·但是这种恢复也是有条件的,在protothread中是用行号进行恢复,若是用到的源文件的行号出现改变,则可能执行错乱,如下所示

    1.2K20编辑于 2023-03-09
  • 来自专栏韩曙亮的移动开发专栏

    【Kotlin 异常处理 ② ( SupervisorJob | supervisorScope 作用域构建器函数 )

    文章目录 一、SupervisorJob 二、supervisorScope 作用域构建器函数 在上一篇博客介绍了 异常处理 【Kotlin 异常处理 ① ( 根异常处理 | 自动传播异常 | 在体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根异常处理 | 异常传播特性 ) , 其中介绍了 中异常的传播特性 : 运行时 , 产生异常 , 会将异常 传递给 父 , 父会执行如下操作 : ① 取消子 : 不仅仅取消产生异常的子 , 该父下所有的子都会取消 ; ② 取消父 : 将父本身取消 ; ③ 向父的父传播异常 : 继续将异常传播给 父的父 ; 这样就会导致 某个子一旦出现异常 , 则 兄弟 , 父 , 父的兄弟 , 父的父 等等 都会被取消 , 这样牵连太大 , 因此本篇博客中引入几种异常处理机制解决上述问题 ; 一、SupervisorJob ---- SupervisorJob 执行时如果 该类型的 子 出现异常 , 不会将 异常传递给 父 , 因此也不会影响到 父 下的 其它子

    1.1K10编辑于 2023-03-30
  • 来自专栏飞鸟的专栏

    十、python学习笔记--非爬虫(对比和非效率)

    # 一个简单的小爬虫,将3个页面的数据保存到data.html,对比和非的使用时间 """非 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过for循环执行(非会在IO

    67720编辑于 2022-02-10
  • 来自专栏python3

    的特点是利用任务的阻塞时间去处理其他任务 处理任务的是线程,而是单线程,占用资源由大到小排:多进程>多进程> gevent模块封装greenlet模块,greenlet模块封装yield 在 gevent.sleep,或者使用monkey补丁实现替换 如代码因为monkey.patch_all()补丁问题报错,将from gevent import monkey和补丁代码放到最前面尝试 使用完成多任务三个例子 --") g3 = gevent.spawn(func3, 5) print("---4---") # 的最大特点就是利用某个任务阻塞的时间去处理其他任务 # 等待执行 gevent.joinall ([ gevent.spawn(func1, 5), gevent.spawn(func2, 5), gevent.spawn(func3, 5) ]) # g1.join() # g2.join() # g3.join()

    78720发布于 2020-01-17
  • 来自专栏zingpLiu

    及Python中的

    1 1.1的概念 ,又称微线程,纤。英文名Coroutine。一句话说明什么是线程:是一种用户态的轻量级线程。 那么这么来理解比较容易: 线程是系统级别的,它们是由操作系统调度;是程序级别的,由程序员根据需要自己调度。 1.2 的优缺点 的优点:   (1)无需线程上下文切换的开销,避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,也失去了标准线程使用多CPU的能力)   (2)无需原子操作锁定及同步的开销   (3)方便切换控制流,简化编程模型   (4)高并发+高扩展性+低成本:一个CPU支持上万的都不是问题。 实现,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级

    1.7K20发布于 2018-09-05
  • 来自专栏每日一篇技术文章

    一边吃饭一边听音乐,听音乐和吃饭可以在时间上同时进行 3.并行不一定有并发效率高 并行不一定会加快运行速度,因为并行运行的组件之间可能需要相互通信。 4.Go 是什么? Go 是与其他函数或方法一起并发运行的函数或方法。Go 可以看作是轻量级线程。与线程相比,创建一个 Go 的成本很小。 与函数不同,程序控制不会去等待 Go 执行完毕。在调用 Go 程之后,程序控制会立即返回到代码的下一行,忽略该的任何返回值。 如果希望运行其他 Go ,Go 主必须继续运行着。 信道可用于在其他结束执行之前,阻塞 Go 主。 image.png 由于main 函数 会很快执行完毕 导致子 停止工作,所以我们加一个3秒的延时 让main 函数休眠,从而让它的两个个子能够执行执行完毕

    89950发布于 2019-06-11
  • 来自专栏Phoenix的Android之旅

    Kotlin-特殊的阻塞

    阻塞是种特殊的启动方式,一般是用 runBlocking{} 扩起来一段。 首先是父得到执行,然后才是子。 重点是这两段都在同一个线程main里完成。这里就带来一个有趣的问题, runBLocking{}和平时常用的launch有什么区别? 在创建完coroutine后就进入派发流程了,这部分和Kotlin-一个的生命周期中的逻辑比较相似,下面也会讲到。 每个线程都可以起一个独立的阻塞队列。 这个问说明,runBLocking{}这种,它的运行逻辑是先把父放队列里,然后取出来执行,执行完毕再把子入队,再出队子,用同样的方式递归。

    2.9K20发布于 2021-05-17
  • 来自专栏python3

    Python:线程、进程与(3)——

    这三个都是threading.Condition()对象,条件变量,而且维护的是同一把锁对象mutex(关于threading模块中Lock对象和Condition对象可参考上篇博文Python:线程、进程与3)task_done() 源码如下: def task_done(self):             self.all_tasks_done.acquire()       #获得锁          consumer_even.join()     consumer_odd.join() if __name__ == '__main__':     main() 这个例子跟上篇博文Python:线程、进程与

    59320发布于 2020-01-03
  • 来自专栏python3

    python与golang的区

    和线程的关系 是在语言层面实现对线程的调度,避免了内核级别的上下文消耗。 python与调度 Python的源于yield指令。 + %s = %s" % (x, y, result)) loop = asyncio.get_event_loop() tasks = [print_sum(1, 2), print_sum(3, 和大多数语言一样,在 Python 中,的调度是非抢占式的,也就是说一个必须主动让出执行机会,其他才有机会运行。 让出执行的关键字就是 await。 (goroutines)和协(coroutines) //Go 意味着并行(或者可以以并行的方式部署),一般来说不是这样的 //Go 通过通道来通信;通过让出和恢复操作来通信 // true return } } }() go func() { for j := 1; j <= 3;

    1.8K20发布于 2020-01-06
  • 来自专栏Bennyhuo

    破解 Kotlin (5) - 取消篇

    关键词:Kotlin 取消 任务停止 的任务的取消需要靠内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。 ,那么问题来了,这里并没有告诉它父究竟是谁,因此也就谈不上作用域的事儿了,这好像我们用 GlobalScope.launch 启动了一个一样。 父。 4.2 如何正确的将回调转换为 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建呢? 接着我们将之前我们一直提到的回调转的例子进一步升级,支持取消,这样大家就可以轻易的将回调转变为的挂起调用了。 最后我们还分析了一下 Retrofit 的扩展的一些问题和解决方法,这个例子也进一步可以引发我们对作用域以及如何将现有程序化的思考。

    2.3K50发布于 2020-02-20
  • 来自专栏区块链入门

    【深度知识】Golang调度:状态

    Grunnable Golang中,一个在以下几种情况下会被设置为 Grunnable状态: 创建 Go 语言中,包括用户入口函数main·main的执行goroutine在内的所有任务,都是通过runtime execute(gp); // Schedule it back, never returns. } } schedule(); } runtime·park函数包含3个参数

    2.5K30发布于 2019-08-14
  • 来自专栏Phoenix的Android之旅

    Kotlin-派发和调度框架

    搞清楚内部概念对分析源码来说非常关键。 的最小粒度-Coroutine 对没接触过的人来说,一个OOP代码的最小调度粒度是函数。 在中,最小的调度粒度是,在kotlin中叫coroutine。 按理说接下来应该是“Hello”,但实际情况是“launch 3”。 因为在遇到挂起函数delay的时候,会把当前coroutine挂起,然后调度另外一个待执行的coroutine去执行。 外部概念和内部概念 中外部概念和内部概念的差别很大。对应开发者来说,一个的最小粒度coroutine,在的内部概念中叫DispatchedContinuation。 为什么可以提升效率,在Kotlin-设计的基础中有具体解释。

    1.4K30发布于 2021-04-26
  • 来自专栏Bennyhuo

    破解 Kotlin (2) - 启动篇

    而对于 join, ... log(3) job.join() log(4) 因为要等待执行完毕,因此输出的结果一定是: 14:47:45:963 [main] 1 14:47:46:054 [main 我们创建了后立即 cancel,但由于是 ATOMIC 模式,因此一定会被调度,因此 1、2、3 一定都会输出,只是 2 和 3 的顺序就难说了。 } job.cancel() log(4) job.join() 我们在 2 和 3 之间加了一个 delay, delay 会使得体的执行被挂起,1000ms 之后再次调度后面的部分,因此 3 , delay 是挂起点,因此 3 会等 100ms 后再次调度,这时候 4 执行, join 要求等待执行完,因此等 3 输出后再执行 5。 关于的调度,我们后面再聊。 3. 小结 本文通过一些例子来给大家逐步揭开的面纱。

    1.4K30发布于 2020-02-20
领券