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

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

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

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

    Go-使用和泄漏

    “永远不要在不知道如何停止的情况下开始一个goroutine”,即对于所起的goroutine的生命周期管理要十分明确go泄漏如果启动了一个goroutine,希望他终止时并未终止,这就出现了泄漏; 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
  • 来自专栏数据科学(冷冻工厂)

    Python 异步: 4

    可能因多种原因而暂停,例如执行另一个,例如等待另一个任务,或等待一些外部资源,如套接字连接或进程返回数据。用于并发。可以同时创建和执行许多和子例程都可以调用自己的其他实例。一个子程序可以调用其他子程序。执行其他。但是,也可以执行其他子例程。当一个执行另一个时,它必须暂停执行并允许另一个在另一个完成后恢复。 4. 与任务子例程和协可能代表程序中的“任务”。但是,在 Python 中,有一个称为 asyncio.Task 对象的特定对象。 可以包装在 asyncio.Task 对象中并独立执行,而不是直接在中执行。 Task 对象提供异步执行的句柄。Task:一个可以独立执行的包装。这允许包装的在后台执行。 调用可以继续执行指令而不是等待另一个。Task 不能单独存在,它必须包装一个。因此,Task 是,但不是任务。5. 与线程比线程更轻量级。

    1.1K20编辑于 2023-01-28
  • 来自专栏数据科学(冷冻工厂)

    Python 异步: 4

    可能因多种原因而暂停,例如执行另一个,例如等待另一个任务,或等待一些外部资源,如套接字连接或进程返回数据。 用于并发。可以同时创建和执行许多和子例程都可以调用自己的其他实例。一个子程序可以调用其他子程序。执行其他。但是,也可以执行其他子例程。当一个执行另一个时,它必须暂停执行并允许另一个在另一个完成后恢复。 4. 与任务 子例程和协可能代表程序中的“任务”。但是,在 Python 中,有一个称为 asyncio.Task 对象的特定对象。 可以包装在 asyncio.Task 对象中并独立执行,而不是直接在中执行。 Task 对象提供异步执行的句柄。 Task:一个可以独立执行的包装。 这允许包装的在后台执行。 调用可以继续执行指令而不是等待另一个。Task 不能单独存在,它必须包装一个。因此,Task 是,但不是任务。 5. 与线程 比线程更轻量级。

    89930编辑于 2023-02-27
  • 来自专栏飞鸟的专栏

    十、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 app:layout_constraintHorizontal_bias="0.5"/> </androidx.constraintlayout.widget.ConstraintLayout> 4

    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和补丁代码放到最前面尝试 使用完成多任务三个例子 print("---2---") g2 = gevent.spawn(func2, 5) print("---3---") g3 = gevent.spawn(func3, 5) print("---4- --") # 的最大特点就是利用某个任务阻塞的时间去处理其他任务 # 等待执行 gevent.joinall([ gevent.spawn(func1, 5), gevent.spawn

    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
  • 来自专栏每日一篇技术文章

    4.Go 是什么? Go 是与其他函数或方法一起并发运行的函数或方法。Go 可以看作是轻量级线程。与线程相比,创建一个 Go 的成本很小。 for的子块,for执行完毕后,它占用的内存就会被释放,那么它的子块作用域也会被释放 go 的理论如下 启动一个新的时,的调用会立即返回。 与函数不同,程序控制不会去等待 Go 执行完毕。在调用 Go 程之后,程序控制会立即返回到代码的下一行,忽略该的任何返回值。 如果希望运行其他 Go ,Go 主必须继续运行着。 如果 Go 主终止,则程序终止,于是其他 Go 也不会继续运行 注意 main 函数其实调用也是一个,它被称为 主 package main import "fmt" func print 信道可用于在其他结束执行之前,阻塞 Go 主

    89950发布于 2019-06-11
  • 来自专栏Bennyhuo

    破解 Kotlin (4) - 异常处理篇

    需要明确的一点是,通过 async 启动的出现未捕获的异常时会忽略 CoroutineExceptionHandler,这与 launch 的设计思路是不同的。 4. 通过 GlobeScope 启动的单独启动一个作用域,内部的子遵从默认的作用域规则。通过 GlobeScope 启动的“自成一派”。 它更适合一系列对等的并发的完成一项工作,任何一个子异常退出,那么整体都将退出,简单来说就是”一损俱损“。这也是内部再启动子的默认作用域。 supervisorScope 同样继承外部作用域的上下文,但其内部的取消操作是单向传播的,父向子传播,反过来则不然,这意味着子出了异常并不会影响父以及其他兄弟。 ,出现未捕获的异常会尝试传递给父并尝试取消父

    1.6K10发布于 2020-02-20
  • 来自专栏Phoenix的Android之旅

    Kotlin-特殊的阻塞

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

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

    python与golang的区

    和线程的关系 是在语言层面实现对线程的调度,避免了内核级别的上下文消耗。 python与调度 Python的源于yield指令。 %s = %s" % (x, y, result)) loop = asyncio.get_event_loop() tasks = [print_sum(1, 2), print_sum(3, 4) 和大多数语言一样,在 Python 中,的调度是非抢占式的,也就是说一个必须主动让出执行机会,其他才有机会运行。 让出执行的关键字就是 await。 (goroutines)和协(coroutines) //Go 意味着并行(或者可以以并行的方式部署),一般来说不是这样的 //Go 通过通道来通信;通过让出和恢复操作来通信 // ---- 某书 4种状态 Pending Running Done Cacelled 和系统线程之间的映射关系 go的本质上还是系统的线程调用,而Python中的是eventloop模型实现

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

    破解 Kotlin (5) - 取消篇

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

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

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

    Grunnable Golang中,一个在以下几种情况下会被设置为 Grunnable状态: 创建 Go 语言中,包括用户入口函数main·main的执行goroutine在内的所有任务,都是通过runtime

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

    Kotlin-派发和调度框架

    一个coroutine创建好之后,就交给框架去调度了。这篇主要讲从launch{...}开始,到最终得到执行的时候,所涉及到的框架内部概念。 搞清楚内部概念对分析源码来说非常关键。 的最小粒度-Coroutine 对没接触过的人来说,一个OOP代码的最小调度粒度是函数。 在中,最小的调度粒度是,在kotlin中叫coroutine。 外部概念和内部概念 中外部概念和内部概念的差别很大。对应开发者来说,一个的最小粒度coroutine,在的内部概念中叫DispatchedContinuation。 为什么可以提升效率,在Kotlin-设计的基础中有具体解释。

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

    破解 Kotlin (2) - 启动篇

    我们说过,启动需要三样东西,分别是 上下文、启动模式、体,体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。 而对于 join, ... log(3) job.join() log(4) 因为要等待执行完毕,因此输出的结果一定是: 14:47:45:963 [main] 1 14:47:46:054 [main 是挂起点,因此 3 会等 100ms 后再次调度,这时候 4 执行, join 要求等待执行完,因此等 3 输出后再执行 5。 我们在前面提到我们的示例都运行在 suspend main 函数当中,所以 suspend main 函数会帮我们直接启动一个,而我们示例的都是它的子,所以这里 5 的调度取决于这个最外层的的调度规则了 关于的调度,我们后面再聊。 3. 小结 本文通过一些例子来给大家逐步揭开的面纱。

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