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

    破解 Kotlin (3) - 调度篇

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

    1.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较慢。

    1.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.3K20编辑于 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.3K20编辑于 2023-03-09
  • 来自专栏飞鸟的专栏

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

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

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

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

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

    1.2K10编辑于 2023-03-30
  • 来自专栏zingpLiu

    及Python中的

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

    1.8K20发布于 2018-09-05
  • 来自专栏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()

    82820发布于 2020-01-17
  • 来自专栏每日一篇技术文章

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

    92750发布于 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
  • 来自专栏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:线程、进程与

    63120发布于 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
  • 来自专栏区块链入门

    【深度知识】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
  • 来自专栏Bennyhuo

    破解 Kotlin (5) - 取消篇

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

    2.3K50发布于 2020-02-20
  • 来自专栏每日一篇技术文章

    i++{ go add(1,&ws) } ws.Wait() fmt.Println(total) } 我们对一个变量total 进行1000次 +1 操作,不过我们是在多个协中进行的 image.png 竞争发生的概率,和你的数量成正比,如果你的数很少的话,可能运行几百次发现不了这个现象 那如何避免这个问题呢? ---- Mutex Mutex 用于提供一种加锁机制(Locking Mechanism),可确保在某时刻只有一个在临界区运行,以防止出现竞态条件。 总体说来,当 Go 需要与其他通信时,可以使用信道。而当只允许一个访问临界区时,可以使用 Mutex。 就我们上面解决的问题而言,我更倾向于使用 Mutex,因为该问题并不需要间的通信。所以 Mutex 是很自然的选择。 我的建议是去选择针对问题的工具,而别让问题去将就工具。:)

    71020发布于 2019-06-11
  • 来自专栏全栈程序员必看

    Unity

    当然既然这样,还有使用么?当然还是有用的,只不过大家需要根据场景进行使用。因为有些逻辑用来还是比较方便的,如果不用的话可能需要手敲一串子代码。 3是通过方法直接调用,可以支持任何参数。 由上可以看出,1.对于使用方法名的调用带参数的函数,运行时会报错。 2 .同一个函数可以被多次调用。 方式2:停止使用方法名启动的此方法的函数,如图所示 并没有停止使用调用方式3开启的 方式3:停止对应启动方式3开启的,如图 方式4:停止的开启时的其返回值,可以停止以以上三种方式开启的 实际开发中使用建议 开发中,并不是所有的脚本都继承自mono,相反实际项目中大部分都不会继承自mono,所以我们可以单独拿出来一个继承自Mono的单例类,专门用于开启。 但是应该禁止使用sting的方式开启和关闭,所以我们的单例应该禁止其访问这些方法。

    96220编辑于 2022-07-02
  • 来自专栏Phoenix的Android之旅

    Kotlin-派发和调度框架

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

    1.5K30发布于 2021-04-26
  • 来自专栏Phoenix的Android之旅

    Kotlin-的内部概念Continuation

    实现这个能力的关键在于实现了continuation接口。 从源码里猜测,它肯定是一个实现了continuation的类,因此它才能有可重入性。 把编译后的字节码用jd-gui打开可以看到,我们所写的会给编译器插入代码,实现SuspendLambda接类, ? 这个调用链可以看出我们所写的的可重入性是怎么实现的了。 从block到coroutine 上面的分析,只展现了一个block目前所具有的特点。 所以会看到虽然的外部概念很清晰,只是一个 coroutine,但在内部,实际上支撑它的还有Continuation,Dispatch,Intercept。还是挺复杂的。

    2.2K40发布于 2021-05-17
领券