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

    Go使用chan或context退出

    问题go两个协使用了同一个文件句柄,其中一个关闭了这个文件句柄并退出,如何及时通知另一个退出?分析当一个关闭了这个文件对象后,底层文件的文件描述符就会被释放。 其他收到通知后,就不再对这个已关闭的文件对象进行操作。1. 使用 channel 通道在主中,可以定义一个 channel,用来通知其它退出在执行时可以监听这个 channel,一旦接收到退出通知,就可以进行清理工作,并退出。 select { case <-quit: return default: // ... } }}()// 主中发送退出通知 在主中可以创建一个 context 对象,并将其传递给,然后调用 cancel 方法,通知所有退出

    84010编辑于 2023-08-12
  • 来自专栏一起学Golang

    Golang并发:并发的优雅退出

    它在并发中的使用场景是:当只从1个channel读取数据,然后进行处理,处理后退出。下面这个示例程序,当in通道被关闭时,可自动退出。 第一种:如果某个通道关闭后,需要退出,直接return即可。 接收的退出了,如果它直接退出,不告知发送,发送将阻塞。 启动了一个工作协处理数据,如何通知它退出? 使用一个专门的通道,发送退出的信号,可以解决这类问题。 技巧:把接收方的通道入参声明为只读,如果接收关闭只读,编译时就会报错。 处理1个通道,并且是读时,优先使用for-range,因为range可以关闭通道的关闭自动退出。 ,ok可以处理多个读通道关闭,需要关闭当前使用for-select的。 显式关闭通道stopCh可以处理主动通知退出的场景。

    5.6K30发布于 2019-04-11
  • 来自专栏旅途散记

    Go语言通知退出(取消)的几种方式

    如下是一些在 Go 中通知退出的常见方式: 使用通道(Channel):通过发送特定的信号或关闭通道来通知退出。这是最简单直接的方法。 **使用 sync.WaitGroup**:虽然 WaitGroup 本身不用于发送取消信号,但它可以用来等待一组完成,通常与其他方法(如通道)结合使用来控制退出。 1. 在线代码[2] 在上面这两个示例中,当主函数完成其工作后,通过通道发送信号或调用 cancel 函数来通知退出。 使用 sync.WaitGroup 控制退出 sync.WaitGroup 主要用于等待一组的完成。其不直接提供通知退出的机制,但可以与其他方法(如通道)结合使用来控制退出。 ,可以定期检查这个标志来决定是否退出),而不使用通道来做间的通信 参考资料 [1] 在线代码: https://go.dev/play/p/HrZbNO-jyKf [2] 在线代码: https

    1.4K10编辑于 2024-02-05
  • 来自专栏飞鸟的专栏

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

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

    1K31编辑于 2022-02-10
  • 来自专栏Bennyhuo

    破解 Kotlin (10) - Select 篇

    关键词:Kotlin Select 多路复用 Select 并不是什么新鲜概念,我们在 IO 多路复用的时候就见过它,在 Java NIO 里面也见过它。 接下来给各位介绍的是 Kotlin 的 Select。 小结 在当中,Select 的语义与 Java NIO 或者 Unix 的 IO 多路复用类似,它的存在使得我们可以轻松实现 1 拖 N,实现哪个先来就处理哪个。 尽管 Select 和 Channel 比起标准库的 API 已经更接近业务开发了,不过个人认为它们仍属于相对底层的 API 封装,在实践当中多数情况下也可以使用 Flow API 来解决。 而这个 Flow API,完全就是响应式编程的版 API,我们简直可以照着 RxJava 来学习它,所以我们下一篇再见吧~~~

    1.1K40发布于 2020-02-20
  • 来自专栏C++小白

    小白学笔记1-概念初识-2021-2-10

    文章目录 前言 一、从进程、线程到 1.进程 2.线程 3. 二、对称和非对称 三、常见语言对的支持 总结 前言 本文对的概念做了简要介绍,适合初次接触的小白。 比如当你打开游戏时,操作系统中就会创建一个游戏进程,当退出游戏时,对应进程也会终止。 那为什么要引入进程这一个概念呢?众所周知,操作系统具有并发、共享、异步、虚拟的特性。 在执行的过程中可以调用其他的,保护上下文切换到其他,之后调用返回恢复到调用的地址继续执行,这个过程类似于多线程的线程的切换。 进程线程的示意图如下所示: 也有自己的缺点,当调用阻塞IO操作的时候,操作系统会让线程进入阻塞状态,这时和其它绑定在该线程之上的都会陷入阻塞而得不到调度。 二、对称和非对称 一般分为对称和非对称两种,定义如下: 非对称(asymmetric coroutines)是跟一个特定的调用者绑定的,让出CPU时,只能让回给调用者。

    1.3K10编辑于 2022-02-22
  • 来自专栏韩曙亮的移动开发专栏

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

    文章目录 一、概念 二、作用 三、创建 Android 工程并进行相关配置 1、创建 Android 工程 2、配置环境 3、布局文件 4、异步任务代码示例 5、代码示例 6、完整代码示例 四、异步任务与对比 一、概念 ---- Coroutine 是 Kotlin 语言 中新出现的概念 , 在 Java 语言中没有 ; 是 基于 线程 的 , 是 轻量级 线程 ; 二、作用 ---- 主要作用如下 : 处理耗时任务 : 耗时任务 通常需要 阻塞主线程 , 线程量级太重 , 耗时任务 推荐在中执行 ; 保证主线程安全 : 从主线程中 安全地调用可能会挂起的函数 包下的 Executor,ThreadPoolExecutor,FutureTask 取代 AsyncTask ; 三、创建 Android 工程并进行相关配置 ---- 1、创建 Android Project " 选项 , 创建工程 , 创建 Empty Activity ; 注意选择 Kotlin 语言 , Android Studio 会自动添加 Kotlin 语言支持 ; 2、配置环境

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

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

    及Python中的

    1 1.1的概念 ,又称微线程,纤。英文名Coroutine。一句话说明什么是线程:是一种用户态的轻量级线程。 那么这么来理解比较容易: 线程是系统级别的,它们是由操作系统调度;是程序级别的,由程序员根据需要自己调度。 1.2 的优缺点 的优点:   (1)无需线程上下文切换的开销,避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,也失去了标准线程使用多CPU的能力) 的缺点:   (1)无法利用多核资源:的本质是个单线程,它不能同时将 单个CPU 的多个核用上,需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu 实现,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级

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

    4.Go 是什么? Go 是与其他函数或方法一起并发运行的函数或方法。Go 可以看作是轻量级线程。与线程相比,创建一个 Go 的成本很小。 与函数不同,程序控制不会去等待 Go 执行完毕。在调用 Go 程之后,程序控制会立即返回到代码的下一行,忽略该的任何返回值。 如果希望运行其他 Go ,Go 主必须继续运行着。 如果 Go 主终止,则程序终止,于是其他 Go 也不会继续运行 注意 main 函数其实调用也是一个,它被称为 主 package main import "fmt" func print 信道可用于在其他结束执行之前,阻塞 Go 主。 := 1 ;i < 10 ;i++ { fmt.Printf("%d - 第 %d 循环 \n",num, i) } } func main() { go print(

    89950发布于 2019-06-11
  • 来自专栏韩曙亮的移动开发专栏

    【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++小白

    小白学笔记2-c语言实现-2021-2-10

    .实现 总结 前言 前面我们已经了解到的基本概念以及对称和非对称的定义,本节将对如何用c语言在用户态实现切换作以简单介绍。 static int i, state = 0; switch (state) { case 0: /* start of function */ for (i = 0; i < 10 如果uc_link为NULL,则线程退出。 函数的第二个参数指向的函数,如果func函数返回,则恢复makecontext第一个参数指向的上下文第一个参数指向的上下文context_t中指向的uc_link.如果uc_link为NULL,则线程退出 regs[7]: rdi | // | regs[8]: rsi | // | regs[9]: ret | //ret func addr, 对应 rax // | regs[10

    1.8K20编辑于 2022-02-22
  • 来自专栏python3

    python与golang的区

    的定义: 通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。 和线程的关系 是在语言层面实现对线程的调度,避免了内核级别的上下文消耗。 python与调度 Python的源于yield指令。 和大多数语言一样,在 Python 中,的调度是非抢占式的,也就是说一个必须主动让出执行机会,其他才有机会运行。 让出执行的关键字就是 await。 (goroutines)和协(coroutines) //Go 意味着并行(或者可以以并行的方式部署),一般来说不是这样的 //Go 通过通道来通信;通过让出和恢复操作来通信 // 进程退出时不会等待并发任务结束,可用通道(channel)阻塞,然后发出退出信号 func main() { jobs := make(chan int) done := make(chan

    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 每个goroutine结束后就自行退出销毁,不留一丝痕迹。

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

    Kotlin-派发和调度框架

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

    1.4K30发布于 2021-04-26
领券