协程

多任务-协程

放肆的年华 提交于 2019-12-05 05:15:09
目录   迭代器   生成器   协程-yield   协程-greenlet   协程-gevent   进程、线程、协程区别    一、迭代器     迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。   1.可迭代对象     我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代     但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,既供我们迭代吗?        >>> for i in 100:   ... print(i)   ...   Traceback (most recent call last):   File "<stdin>", line 1, in <module>   TypeError: 'int' object is not iterable   >>>   # int整型不是iterable,即int整型不是可以迭代的   # 我们自定义一个容器MyList用来存放数据,可以通过add方法向其中添加数据   >>> class MyList(object):

多进程和协程区别

房东的猫 提交于 2019-12-05 05:05:41
多进程 是在多个进程中,一个进程的阻塞并不会影响到其他进程。比如在一个进程中进行大量的计算操作,并不会对其他进程产生较大影响。 协程 就是在一个线程中,如果协程中一个任务发生阻塞,其余任务也将受到影响。比如说在一个任务中,进行大量的计算操作,那么这个任务将会阻塞其余的任务。 所以协程不适合处理计算密集型的任务,而适合处理IO密集型的任务,因为携程配合异步IO,就可以在不阻塞进程情况下,又能获得同步编程的快感。 来源: https://www.cnblogs.com/bigtreei/p/11908473.html

go语言入门(10)并发编程

三世轮回 提交于 2019-12-05 03:49:35
1,概述 1.1并发和并行 并行(parallel) : 指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency) : 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 1.2go语言并发优势   有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。   Go语言为并发编程而内置的上层API基于CSP(communicating sequential processes, 顺序通信进程)模型。 这就意味着显式锁都是可以避免的 ,因为Go语言通过相册安全的通道发送和接受数据以实现同步,这大大地简化了并发程序的编写。   一般情况下,一个普通的桌面计算机跑十几二十个线程就有点负载过大了,但是同样这台机器却可以轻松地让成百上千甚至过万个goroutine进行资源竞争。 2,goroutine 2.1goroutine是什么   goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程

Gevent模块,协程应用

十年热恋 提交于 2019-12-05 03:12:28
Gevent官网文档地址: http://www.gevent.org/contents.html 进程、线程、协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点: 相同点存在于,当我们挂起一个执行流的时,我们要保存的东西: 栈, 其实在你切换前你的局部变量,以及要函数的调用都需要保存,否则都无法恢复 寄存器状态,这个其实用于当你的执行流恢复后要做什么 而寄存器和栈的结合就可以理解为上下文,上下文切换的理解: CPU看上去像是在并发的执行多个进程,这是通过处理器在进程之间切换来实现的,操作系统实现这种交错执行的机制称为上下文切换 操作系统保持跟踪进程运行所需的所有状态信息。这种状态,就是上下文。 在任何一个时刻,操作系统都只能执行一个进程代码,当操作系统决定把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从它上次停止的地方开始。 不同点: 执行流的调度者不同,进程是内核调度,而协程是在用户态调度,也就是说进程的上下文是在内核态保存恢复的

Python核心技术与实战——十五|Python协程

拈花ヽ惹草 提交于 2019-12-05 02:28:22
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程。那什么是协程呢? 协程 协程是实现并发编程的一种方式。提到并发,肯很多人都会想到多线程/多进程模型,这就是解决并发问题的经典模型之一。在最初的互联网世界中,多线程/多进程就在服务器并发中起到举足轻重的作用。 但是随着互联网的发展,慢慢很多场合都会遇到C10K瓶颈,也就是同时连接到服务器的客户达到1W,于是,很多代码就跑崩溃,因为进程的上下文切换占用了大量的资源,线程也顶不住如此巨大的压力。这时候,NGINX就带着事件循环闪亮登场了。 事件循环启动一个统一的调度器,让调度器来决定一个时刻去运行哪个任务,于是省却了多线程中启动线程、管理线程、同步锁等各种开销。同一时期的NGINX,在高并发下也能保持资源消耗低、性能高,相比Apache也支持更多的并发连接。 再到后来,出现了一个很有名的名词——回调地狱(callback hell).很多写过JavaScript的朋友明白那是什么。大家惊喜的发现,这种工具很完美的继承了事件循环的优越性,同时还能提供async/await语法糖,解决了执行性和可读性共存的难题。于是,协程渐渐被更多人发现并看好,也有越来越多的人尝试用Node.js做起了后端开发。 回到Python中,使用生成器来实现协程已经是Python2时代的老方法了

golang中并发sync和channel

我只是一个虾纸丫 提交于 2019-12-05 01:53:32
golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go”,但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程。更高级的同步操作通过信道与通信进行。 type Cond func NewCond(l Locker) *Cond func (c *Cond) Broadcast() func (c *Cond) Signal() func (c *Cond) Wait() type Locker type Mutex func (m *Mutex) Lock() func (m *Mutex) Unlock() type Once func (o *Once) Do(f func ()) type Pool func (p *Pool) Get() interface {} func (p *Pool) Put(x interface {}) type RWMutex func (rw *RWMutex) Lock() func (rw *RWMutex) RLock() func (rw *RWMutex) RLocker() Locker func (rw

go中的数据结构通道-channel

谁说胖子不能爱 提交于 2019-12-05 01:49:11
1. channel的使用   很多文章介绍channel的时候都和并发揉在一起,这里我想把它当做一种数据结构来单独介绍它的实现原理。   channel,通道。golang中用于数据传递的一种数据结构。是golang中一种传递数据的方式,也可用作事件通知。 1.1 声明、传值、关闭   使用chan关键字声明一个通道,在使用前必须先创建,操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。 1 //声明和创建 2 var ch chan int // 声明一个传递int类型的channel 3 ch := make(chan int) // 使用内置函数make()定义一个channel 4 ch2 := make(chan interface{}) // 创建一个空接口类型的通道, 可以存放任意格式 5 6 type Equip struct{ /* 一些字段 */ } 7 ch2 := make(chan *Equip) // 创建Equip指针类型的通道, 可以存放*Equip 8 9 //传值 10 ch <- value // 将一个数据value写入至channel,这会导致阻塞,直到有其他goroutine从这个channel中读取数据 11 value := <-ch // 从channel中读取数据,如果channel之前没有写入数据

16 协程和www

荒凉一梦 提交于 2019-12-05 01:43:53
1、一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。 2协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。 什么是协程 答:协程是一段在主线程中执行的代码逻辑(代码块)协程不是多线程,本质依然是从上到下依次执行。 Unity协程的执行原理(执行过程)是什么?(15分,每条5分) 答:(1)unity中协程执行过程中,通过yield return XXX,将程序挂起,去执行接下来的内容。 (2)注意协程不是线程,在为遇到yield return XXX语句之前,协程的方法和一般的方法是相同的,也就是程序在执行到yield return XXX语句之后,接着才会执行的是 StartCoroutine()方法之后的程序。 (3)协程走的还是单线程模式,仅仅是将yield return XXX语句之后的内容暂时挂起,等到特定的时间才执行。 unity中协程执行过程中,通过yield return XXX,将程序挂起,去执行接下来的内容,注意协程不是线程,在为遇到yield return XXX语句之前,协程的方法和一般的方法是相同的,也就是程序在执行到yield return XXX语句之后

Golang协程机制以及异常处理

女生的网名这么多〃 提交于 2019-12-05 00:17:16
golang之所有好用,是因为其将以前编程中常用的而且晦涩难用的异步任务以及信号机制,以傻瓜式的语法给封装了一层。接触了golang已经有一段时间了,现在回头再看一下golang的协程机制,顺便做个总结。 一. 协程机制 详情可查看这篇论文《 Golang协程调度器详解 》 系统内核可以理解成一个经验丰富的管家,能把以前无系统下的各种任务(包括各种异步任务同步任务)给处理的很得当。其基本思想就是建造了进程对象,让cpu在多进程下来回切换,却又让进程无法察觉。这种解决方案彻底将应用层编程给分离了出来。但是后来随着任务量的增加,人们发现频繁的切换进程会造成很多额外的消耗(内存表等进程资源的切换消耗),而随着任务量增加,这种问题尤为突出。于是人们又发明了线程(Thread),线程是基于进程下的多任务,多线程降低了因为系统的进程量,多线程可以共用进程资源,但是多线程的任务切换也离不开内核的上下文切换以及cpu的寄存器内容切换。 golang基于以上计算机成果,在线程上创造了异步任务的实现方法---协程 协程组成: 1. M(应用层调度器):进行协程间的任务调度 2. P(系统线程):决定了最大并发执行任务数,通过 GOMAXPROCS参数控制线程数 3. G(协程): 独立运行的基本单位 基本思想: 调度器 执行时会创建线程池,并把协程放到线程上执行,待协程到了触发点(协程退出

Golang panic 异常捕获

徘徊边缘 提交于 2019-12-05 00:16:37
1. panic异常是伴随协程的,所以在做并发时也一定要在每一个协程中对panic进行捕获和处理 2. 单线程程序修改为并发操作是要格外小心,原来单线程下在request入口处一个panic异常处理就可以保证主程序不会因panic和宕机,现在每一个并发程序中都需要加上该异常处理。 2019-06-17 来源: CSDN 作者: ye_guoyun 链接: https://blog.csdn.net/ye_guoyun/article/details/92712437