coroutine

Kotlin Vocabulary | 揭秘协程中的 suspend 修饰符

痞子三分冷 提交于 2020-12-02 22:09:44
Kotlin 协程把 suspend 修饰符 引入到了我们 Android 开发者的日常开发中。您是否好奇它的底层工作原理呢?编译器是如何转换我们的代码,使其能够挂起和恢复协程操作的呢? 了解这些将会帮您更好地理解挂起函数 (suspend function) 为什么只会在所有工作完成后才会返回,以及如何在不阻塞线程的情况下挂起代码。 本文概要: Kotlin 编译器将会为每个挂起函数创建一个状态机,这个状态机将为我们管理协程的操作! 📚 如果您是 Android 平台上协程的初学者,请查阅下面这些协程 codelab: 在 Android 应用中使用协程 协程的进阶使用: Kotlin Flow 和 Live Data 协程 101 协程简化了 Android 平台的异步操作。正如官方文档 《利用 Kotlin 协程提升应用性能》 所介绍的,我们可以使用协程管理那些以往可能阻塞主线程或者让应用卡死的异步任务。 协程也可以帮我们用命令式代码替换那些基于回调的 API。例如,下面这段使用了回调的异步代码: // 简化的只考虑了基础功能的代码 fun loginUser(userId: String, password: String, userResult: Callback<User>) { // 异步回调 userRemoteDataSource.logUserIn { user

HearthBuddy BotManager

倖福魔咒の 提交于 2020-11-20 08:47:00
MainWindow private void button_0_Click( object sender, RoutedEventArgs e) { Configuration.Instance.SaveAll(); this .button_0.IsEnabled = false ; this .comboBox_1.IsEnabled = false ; this .comboBox_0.IsEnabled = false ; this .checkBox_0.IsEnabled = false ; this .listBox_0.IsEnabled = false ; try { this .bool_0 = false ; if (BotManager.IsRunning) { BotManager.Stop(); } else { BotManager.Start(); } } finally { this .bool_0 = true ; } this .stopwatch_0.Restart(); } BotManager public static bool Start() { object obj = BotManager.object_0; bool result; lock (obj) { if (BotManager.IsRunning) {

python并发编程之asyncio协程(三)

落花浮王杯 提交于 2020-11-18 05:00:10
协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈;协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快、开销更小、效率更高,在有多IO操作的业务中能极大提高效率。 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asyncio协程(三) python并发编程之gevent协程(四) python并发编程之Queue线程、进程、协程通信(五) python并发编程之进程、线程、协程的调度原理(六) asyncio模块创建协程 asyncio在python3.4后被内置在python中,使得python的协程创建变得更加方便。 import asyncio import os # async 关键字定义一个协程 async def target_func1(): print('the func start') print(os.getpid()) print('the func end') def run(): # 创建一个协程对象 coroutine = target_func1() # 创建一个事件循环 loop = asyncio.get_event_loop() loop.run_until_complete

C++20终于要来了...

别等时光非礼了梦想. 提交于 2020-09-28 12:58:11
近日,国际标准化组织(ISO)C++ 组,21 工作组(WG21)正式通过了最终版本的“C++20”草案。 WG21 C++ISO 委员会常任主席 Herb Sutter 说:“在 9 月 4 日,C++20 的 DIS(国际标准草案)投票结束,并获得一致通过。” “这意味着,C++20 现在获得了最终技术许可,并且完成了 ISO 投票。我们希望在完成最后一轮 ISO 编辑工作后,C++20 能在 2020 年底正式发布。” 从历史标准来看,2020 年的 C++ 版本非常庞大。Herb Sutter 表示,“它将是 C++ 自 C++11 以来最大的发行版”,这意味着它比过去 9 年来发布的 3 个发行版都要大。同时,这也是第一个已标准化的版本。 TIOBE CEO Paul Jansen 认为, 新的 C++20 标准带来了极大的正面影响 ,其积极趋势赶超其他编程语言。 在 C++20 中,最重要的两个特性是“ 模块 (Modules) ”和“ 协程 (Coroutine) ”。 据悉,模块(Modules)是由谷歌的 Richard Smith 提出 的,它是针对头文件的改进,并在支持更大构建的同时有助于隔离宏的影响。 正如 Sutter 最近指出的那样,C++20 标志着”大约 35 年来,C++ 首次添加了新特性,用户可以在其中定义命名的封装边界“。 “到现在为止

Python入门基础:理解协程和生成器

情到浓时终转凉″ 提交于 2020-08-18 12:51:18
由于GIL的存在,导致Python多线程性能甚至比单线程更糟。 GIL:全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。[1]即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。 于是出现了协程(Coroutine)这么个东西。 协程:协程,又称微线程,纤程,英文名Coroutine。 协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。 协程由于由程序主动控制切换,没有线程切换的开销,所以执行效率极高。对于IO密集型任务非常适用,如果是cpu密集型,推荐多进程+协程的方式。 在Python3.4之前,官方没有对协程的支持,存在一些三方库的实现,比如gevent和Tornado。3.4之后就内置了asyncio标准库,官方真正实现了协程这一特性。 而Python对协程的支持,是通过Generator实现的,协程是遵循某些规则的生成器。因此,我们在了解协程之前,我们先要学习生成器。 生成器 我们这里主要讨论yield和yield from这两个表达式,这两个表达式和协程的实现息息相关。 Python2

php yield关键字以及协程的实现

人走茶凉 提交于 2020-08-18 07:15:39
php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还有另外一种特殊对象,也就是继承了iterator接口的对象,也可以被对象遍历,但和普通对象的遍历又有所不同,下面是3种类型的遍历情况: 可以看出,迭代器的遍历,会依次调用重置,检查当前数据,返回当前指针数据,指针下移方法,结束遍历的条件在于检查数据返回true或者false 生成器 生成器和迭代器类似,但也完全不同 生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。 生成器使用yield关键字进行生成迭代的值 例如: 一:生成器方法 生成器它的内部实现了以下方法: Generator implements Iterator { //返回当前产生的值 public mixed current ( void ) //返回当前产生的键 public mixed key ( void ) //生成器继续执行 public void next (