首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏源码阅读

    -(下)

    库——protothread ProtoThread源码如下所示: #define LC_INIT(s) s = 0; #define LC_RESUME(s) switch(s) { case ,而外层用name->RoleData的映射关系管理及其他中间态数据;     需要注意的是——以protothread来说: ·对于来说,因为不存在指针等信息,所以的所有信息是可以缓存在共享内存的 ,引发执行流程错乱(所以在使用这类库的时候,应该将函数的实现和协主流程分开,以避免因为逻辑修改导致不可恢复的场景);     对于来说,执行流的恢复只是通过找到下一条指令的执行地址,但是不包括上下文 ,这意味着里面不能有局部变量,需要我们手动把后面需要用到的局部变量缓存起来。      此外这里是通过switch-case实现的,嵌套的switch-case会产生问题,限制比较多,所以也不适用于线上场景。

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

    当前很多的编程语言都内置特性或者有自己的库,如C/C++的libco、golang的goroutine等。而在实现机制上,又可以划分为有,我们分别进行介绍。 ,然后把执行权限通过接口co_swap交还给父即可,并将当前退 是基于函数切换上下文恢复的思路实现被中断的继续执行,但是这个上下文里面有返回地址,即下一条指令的地址 3)如何把执行权限交给被调度的 4)如何让被调度的从被中断的地方继续执行 在前面讨论中,可以认为是一个函数的调用,那么的恢复无非是从调用中断处继续执行,而对于不需要进行上下文恢复 虽然我们可以对上述进行优化和封装,但是在这我们并不准备过多赘述,后面我们则直接看一个开源的库-protothread 库——protothread ProtoThread源码如图所示: ,而外层用name->RoleData的映射关系管理及其他中间态数据 需要注意的是——以protothread来说: 对于来说,因为不存在指针等信息,所以的所有信息是可以缓存在共享内存的

    6.7K43发布于 2021-10-13
  • 来自专栏源码阅读

    (上)

    是基于函数切换上下文恢复的思路实现被中断的继续执行,但是这个上下文里面有返回地址,即下一条指令的地址,所以当程序发生改动重新编译生成,指令地址有可能发生改变,这种对于需要重新编译生成发布的发布场景支持并不友好 的Demo实现     一个库要解决以下几个问题:     1)如何在阻塞调用时归还执行权限?     2)如何选择合适的进行调度?      3)如何把执行权限交给被调度的?     4)如何让被调度的从被中断的地方继续执行?      在前面讨论中,可以认为是一个函数的调用,那么的恢复无非是从调用中断处继续执行,而对于不需要进行上下文恢复,则核心是通过存储标签保证下次调度能从预期的地方继续执行,那么就有:     1) 虽然我们可以对上述进行优化和封装,但是在这我们并不准备过多赘述,后面我们则直接看一个开源的库-protothread     未完待续...

    91440编辑于 2023-03-09
  • 来自专栏一本正经的瞎扯

    我对的理解

    而golang在语言级实现的是独立。 独立必然要为每个协分配空间的内存,golang 1.4开始的大小是2kb,2kb可能对某些很浪费,对某些又完全不够;太多必然也导致分配和GC方面的压力。 之前一直对关注不够,认真学一下后,做了如下总结,然后自己写一些代码来模拟的运作方式: 有这样一些特点: 本质上是generator(生成器),执行generator函数就像是频繁调用某个对象的方法 ;在ABC三条接口相互不依赖的情况下,我们尝试用的方式并发的访问三条接口。 Have Fun,希望你后续能够愉快的使用。:-)

    1.5K30编辑于 2022-02-22
  • 来自专栏TIGERB的技术博客

    初识

    由于Go是Go运行时管理的,并分配于堆上,不由操作系统管理,所以我们先来看看的内存如何被Go运行时管理和回收的。本篇文章先从初步认识开始。 查看本系列完整内容请访问 https://tigerb.cn/go/#/kernal/ 前言 ---- 为了对有个初步的认识,我们先来回顾数据结构中的概念,再来看看内存的概念作用,最后我们再来通过对比进程中的内存和线程中的内存来对中的内存有个初步的认知 谁决定了代码在运行过程中,从空间分配或释放多少内存? 我们分别从「进程」和「线程」、「」视角看看以上两个问题。 进程 什么是进程? 谁决定了代码在运行过程中,从空间(线程)分配或释放多少内存? 答:同进程,编译器决定。 什么是? 答:使用`go`关键字创建一个时,Go运行时从堆上分配一块连续内存作为空间。 谁决定了空间的大小范围?

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

    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
  • 来自专栏网管叨bi叨

    解密Go内存管理

    网管碎碎念:堆和都是编程语言里的虚拟概念,并不是说在物理内存上有堆和之分,两者的主要区别是是每个线程或者独立拥有的,从上分配内存时不需要加锁。 、结构和初始大小在最开始并不是2KB,也是经过了几个版本的更迭 v1.0 ~ v1.1 — 最小内存空间为 4KB; v1.2 — 将最小内存提升到了 8KB; v1.3 — 使用连续替换之前版本的分段 为了解决这个问题,Go在1.2版本的时候不得不将的初始化内存从4KB增大到了8KB。后来把采用连续结构后,又把初始大小减小到了2KB。 | 4KB | 3 _NumStackOrders = 4 - sys.PtrSize/4*sys.GoosWindows - 1*sys.GoosPlan9 var stackpool 在goroutine运行的过程中,如果区的空间使用率不超过1/4,那么在垃圾回收的时候使用runtime.shrinkstack进行栈缩容,当然进行缩容前会执行一堆前置检查,都通过了才会进行缩容 func

    4.7K20发布于 2020-09-21
  • 来自专栏韩曙亮的移动开发专栏

    【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
  • 来自专栏韩曙亮的移动开发专栏

    【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
  • 来自专栏C++小白

    小白学笔记3-实现自己的库(独立,共享)-2021-2-22

    文章目录 前言 一、库实现-独立 1.结构体定义 2.调度器定义 3.创建函数 4.启动/恢复函数 5.挂起函数 6.判断是否运行完毕函数 7.使用示例 二、库实现- 共享 1及调度器结构体定义 1.创建删除工具函数 2.调度器创建、关闭函数 3.创建函数 4.挂起函数 5.启动/恢复函数 6.其余函数 7.应用实例 总结 前言 前面介绍了的基本概念和协切换的常见方式以后 一、库实现-独立 通过独立实现的库中的每一个都有自己独立的空间,大小固定且互不干扰。 id */ return id; } 4.启动/恢复函数 创建完毕以后可以通过coroutine_resume函数进行启动,挂起的也可以通过它进行恢复,定义如下: void coroutine_start -共享 通过共享实现的库中的每一个在运行时都使用一个公共的空间,当挂起时将自己的数据从共享拷贝到自己的独立运行时又将数据从独立拷贝到共享运行,本文是参考cloudyun大神代码进行简要分析

    1.7K40编辑于 2022-02-22
  • 来自专栏Bennyhuo

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

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

    1.6K10发布于 2020-02-20
  • 来自专栏韩曙亮的移动开发专栏

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

    文章目录 一、调度器 二、任务泄漏 三、结构化并发 一、调度器 ---- 是在 调度器 中运行的 , 在中有 3 种调度器 : Dispatchers.Main 调度器 : 在 主线程 ---- 任务泄漏 : 发起 任务 后 , 无法追踪任务的执行结果 , 任务等于无效任务 , 但是仍然会消耗 内存 , CPU , 网络 , 磁盘 等资源 ; Kotlin 中引入了 结构化并发机制 避免 任务泄漏 的情况发生 ; 任务泄漏 与 内存泄漏 类似 ; 三、结构化并发 ---- 结构化并发 使用场景 : 任务取消 : 在不需要任务的时候 , 取消协任务 ; 追踪任务 : 追踪正在执行的任务 ; 发出错误信号 : 如果 任务执行失败 , 发出错误信号 , 表明执行任务出错 ; 任务 运行时 , 必须指定其 CoroutineScope 作用域 , 其会追踪所有的 任务 , CoroutineScope 作用域 可以取消 所有由其启动的任务 ; 常见的 CoroutineScope 作用域 : GlobalScope : 该作用域是 进程级别的

    1.1K20编辑于 2023-03-30
  • 来自专栏Phoenix的Android之旅

    Kotlin-特殊的阻塞

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

    2.9K20发布于 2021-05-17
  • 来自专栏腾讯技术工程官方号的专栏

    从无到 C++异步框架

    而有的实现, 差异最大的地方就是如下两点了: 怎么保存和恢复当前的执行位置 怎么保存和恢复当前引用到的内存(变量等) 本篇主要侧重, 相关的机制后续会具体展开. libco, 与 boost.context 这样的高性能有实现机制后, 标准委员会还会继续寻求的解决方案, 并最终将其作为 C++的实现机制呢, 这里分析主要的原因是为了解决有天然存在的限制 C++17 中基于 Duff Device Hack 的实现, 以及 C++20 中的做更深入的介绍. 2. 但当时的 GCC 用的是 8.3 版本, 并不支持 coroutine20, 所以我们最终采用的是一个基于 C++17 的实现方案, 也就是使用前面介绍的 Duff Device Hack 方式实现的 其中比较重要的一部分就是了, 当时引入的方式和目的都比较直接, 首先是使用 Duff Device Hack 的机制来实现整个.

    2.9K41编辑于 2022-10-13
领券