协程

单线程+多任务异步协程

喜欢而已 提交于 2020-01-16 16:15:02
1.基础概念 1.协程   - 在函数(特殊的函数)定义的时候,如果使用了async修饰的话,则改变函数调用后返回一个协程对象,并且函数内部的实现语句不会被立即执行。 2.任务对象   - 任务对象就是对协程对象的进一步封装,任务对象==高级的协程对象==特殊的函数   - 任务对象必须要注册到事件循环对象中   - 给任务对象绑定回调函数:爬虫的数据解析中 3.事件循环   - 当作是一个容器,容器中必须存放任务对象   - 当启动事件循环对象后,则事件循环对象会对其内部存储任务对象进行一步的执行 4.aiohttp    - 支持异步网络请求的模块 协程 import asyncio def callback(task): # 作为任务对象的回调函数 print('i am callback and ', task.result()) # task.result是用来接收特殊函数的返回值 async def test(): print("i am test") return "123" c = test() # 封装了一个任务对象 task = asyncio.ensure_future(c) task.add_done_callback(callback) # 创建一个事件循环的对象 loop = asyncio.get_event_loop() loop.run_until

Kotlin-协程是什么?

空扰寡人 提交于 2020-01-16 00:41:56
Hi你好,新同学。很高兴,你终于追寻这个问题了,也许你正感到迷茫,各路大神对协程的理解不一,有人说它是线程框架,有人说它比线程更轻,希望我这篇博文可以帮你从另一个角度简单理解协程。 请相信一句话,任何解释从第二个人口中说出时,可能已经存在了变化。而官网是我们接触任何技术最必要的门槛。所以请打开 Kotlin中文网 。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是协程? 异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin协程是基于Kotlin语法从而延伸的一个异步编程框架,它并没有带来多少性能上的体验,它能实现的,你用线程池同样也可以实现,但对于使用角度的来说,协程努力打造一个 "同步方式,异步编程的" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,协程带来了开发上的舒适,但这种舒适是基于 Kotlin 的语法,并不是别的。所以我希望大家刚入手协程时,多从语言角度去理解。 那么,协程是什么? 协程就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。就这么简单 协程怎么用? 启动一个协程 suspend fun main ( ) { GlobalScope . launch { println ( "启动-- ${

协程

时光总嘲笑我的痴心妄想 提交于 2020-01-15 04:08:31
python之协程 一. 协程的概念 二. 简单案例 三. 使用协程模块 - greenlet 四. 使用协程模块 - gevent 五. 给程序打补丁 一. 协程的概念 协程叫做微线程,它是python中实现多任务的方式之一。它比线程更小,占用更小的执行单元,它自带cpu上下文。 线程操作消耗性能,而协程的切换不那么消耗性能。 二. 简单案例 实现一个简单的协程: 使用yield关键字让函数变成生成器,再使用next关键字对其进行唤醒。 # -*- coding:utf-8 -*- import time def work1 ( ) : while True : print ( "work" ) yield time . sleep ( 0.5 ) def work2 ( ) : while True : print ( "work2" ) yield time . sleep ( 0.5 ) def main ( ) : w1 = work1 ( ) w2 = work2 ( ) while True : next ( w1 ) next ( w2 ) if __name__ == '__main__' : main ( ) 结果:(循环) work work2 work work2 . . . . . . . . . . . . 三. 使用协程模块 - greenlet 安装

深入理解协程(三):async/await实现异步协程

雨燕双飞 提交于 2020-01-14 11:54:32
原创不易,转载请联系作者 深入理解协程 分为三部分进行讲解: 协程的引入 yield from实现异步协程 async/await实现异步协程 本篇为 深入理解协程 系列文章的 最后一篇 。 从本篇你将了解到: async/await 的使用。 如何从 yield from 风格的协程修改为 async/await 风格。 篇幅较长,请耐心阅读。 async/await的引入 上篇 【yield from实现异步协程】 我们引入了 asynico 模块,结合 yield from 实现异步协程。但语法不够简洁,其中涉及的 生成器 , 装饰器 也让人头疼不已。 为了语法更加简洁。于是,在Python3.5(PEP 492)中新增了 async/await 语法来实现异步协程。 async/await的使用 先介绍几个概念: async/await :python3.5之后用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。 event_loop :事件循环,程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine :协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 task :任务

Python并发编程协程(Coroutine)之Gevent

南楼画角 提交于 2020-01-13 03:04:17
转载自https://www.cnblogs.com/zhaof/p/7536569.html event官网文档地址: http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点: 我们都可以把他们看做是一种执行流,执行流可以挂起,并且后面可以在你挂起的地方恢复执行,这实际上都可以看做是continuation,关于这个我们可以通过在linux上运行一个hello程序来理解: shell进程和hello进程: 开始,shell进程在运行,等待命令行的输入 执行hello程序,shell通过系统调用来执行我们的请求,这个时候系统调用会讲控制权传递给操作系统。操作系统保存shell进程的上下文,创建一个hello进程以及其上下文并将控制权给新的hello进程。 hello进程终止后,操作系统恢复shell进程的上下文,并将控制权传回给shell进程 shell进程继续等待下个命令的输入 当我们挂起一个执行流的时,我们要保存的东西: 栈, 其实在你切换前你的局部变量

Coroutine 练习 1 - Coroutine Exercises 1

风流意气都作罢 提交于 2020-01-12 23:56:00
1 Coroutine 练习 1 - Coroutine Exercises 1 2 3 字典中为动词 “to yield” 给出了两个释义:产出和让步。对于 Python 生成器中的 yield 来 4 说,这两个含义都成立。 yield item 这行代码会产出一个值,提供给 next(...) 的调 5 用方;此外,还会作出让步,暂停执行生成器,让调用方继续工作,直到需要使用另一个 6 值时再调用 next()。调用方会从生成器中拉取值。 7 从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数。可是,在协 8 程中, yield 通常出现在表达式的右边(例如, datum = yield),可以产出值,也可 9 以不产出,如果 yield 关键字后面没有表达式,那么生成器产出 None。协程可能会从 10 调用方接收数据,不过调用方把数据提供给协程使用的是 .send(datum) 方法,而不是 11 next(...) 函数。通常,调用方会把值推送给协程。 12 yield 关键字甚至还可以不接收或传出数据。不管数据如何流动, yield 都是一种流程控 13 制工具,使用它可以实现协作式多任务:协程可以把控制器让步给中心调度程序,从而激 14 活其他的协程。从根本上把 yield 视作控制流程的方式,这样就好理解协程了。 15 16

Boost - 从Coroutine2 到Fiber

走远了吗. 提交于 2020-01-12 23:50:48
Boost - 从Coroutine2 到Fiber 协程引子 我开始一直搞不懂协程是什么,网上搜一搜,(尤其是Golang的goroutine)感觉从概念上听起来有点像线程池,尤其是类似Java的ExcutorService类似的东西 package helloworld; import java.util.Calendar; import java.util.Date; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallMe { static class Call implements Callable<String>{ @Override public String call() throws Exception { Date d = Calendar.getInstance().getTime(); return d.toString(); } } public static void main(String[] args) throws Exception{

协程Coroutine

旧时模样 提交于 2020-01-12 23:47:36
协程是一种用户态的轻量级线程 。 server的发展如下: IO密集型应用: 多进程->多线程->事件驱动->协程 CPU密集型应用:多进程-->多线程 如果说多进程对于多CPU,多线程对应多核CPU,那么事件驱动和协程则是在充分挖掘不断提高性能的单核CPU的潜力。 异步事件驱动模型中,把会导致阻塞的操作转化为一个异步操作,主线程负责发起这个异步操作,并处理这个异步操作的结果。由于所有阻塞的操作都转化为异步操作,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,所以这种模型的性能通常会比较好。总的说来,当单核cpu性能提升,cpu不在成为性能瓶颈时,采用异步server能够简化编程模型,也能提高IO密集型应用的性能。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其它协程共享全局数据和其它资源。目前主流语言基本上都选择了多线程作为并发设施,与线程相关的概念是抢占式多任务(Preemptive multitasking),而与协程相关的是

Lua 协程coroutine

时间秒杀一切 提交于 2020-01-12 23:46:22
  协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程。 协程是用户空间线程,操作系统其存在一无所知,所以需要用户自己去做调度,用来执行协作式多任务非常合适。   线程和协同程序的主要不同在于:在多处理器情况下, 多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起 。这样Lua的协程就不能利用现在多核技术了。 (一)Coroutine 基础    Lua 协程有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)。可以通过coroutine.status来查看协程出于神马状态。 Lua所支持的协程全称被称作协同式多线程(collaborative multithreading)。Lua为每个coroutine提供一个独立的运行线路。然而和多线程不同的地方就是,coroutine只有在显式调用yield函数后才被挂起,同一时间内只有一个协程正在运行。 Lua将它的协程函数都放进了coroutine这个表里,其中主要的函数如下 创建一个协程需要调用coroutine.create 。它只接收单个参数,这个参数是 coroutine 的主函数。 create

coroutine协程

大兔子大兔子 提交于 2020-01-12 23:43:10
如果你接触过lua这种小巧的脚本语言,你就会经常接触到一个叫做 协程 的神奇概念。大多数脚本语言都有对 协程 不同程度的支持。但是大多编译语言,如C/C++,根本就不知道这样的东西存在。当然也很多人研究如何在编译语言实现 协程 的实现,轮子一个又一个的被发明。 酷壳 这篇文章 《一个“蝇量级” C 语言协程库》 说的很详细,但对于文中介绍的协程库 protothread ,很难看的懂。 风云大哥 在搜索无满意结果后也重新发明轮子,实现自己版本的一个协程库 《C 的 coroutine 库》 , 风云版本的 coroutine 是常规的根据 getcontext/swapcontext 的非常传统的方法,没有用到其他什么奇淫技巧。同时他接口几乎和lua 协程 的接口一样,比较容易看的懂,但是貌似和CPU构架相关,下面详细说。这篇文章就是主要写看风云的代码的,代码注释放到github上面 coroutine ,当然因为代码本身很精练和简单,注释也就非常少的。关于 协程 ,可参考百度百科: 协程 。   开始之前,看看unix/linux下面的 context系列函数 ( 风云大哥 说,windows下面可以用 纤程 实现,以前看《windows核心编程》的时候,了解过这个概念,但是实际上编程运用的只限于进程/线程,没有用到过 纤程 这高级货,现在接触 windows api 也相对少