协程

go语言之goroute协程

早过忘川 提交于 2020-03-02 10:10:42
goroute协程 进程和线程 进程是系统进行资源分配和调度的基本单位,线程是cpu调度和发派的基本单位,一个进程可以创建和撤销多个线程 并发和并行 多线程程序在一个核的cpu上面运行,是并发 多线程程序在多个核的cpu上面运行,这是并行 协程和线程 协程 : 独立的栈空间,共享的堆内存,调度由用户自己控制,本质上有点类似于用户级的线程,这些用户级线程的调度是自己来实现的。 线程:一个线程可以跑多个协程。 一个简单的并发案例 这块两个协程会打印出hello和world package main import( "fmt" "time" ) func test(){ for{ fmt.Println("hello") time.Sleep(time.Second) } } func main(){ go test() for{ fmt.Println("world") time.Sleep(time.Second) } }    来源: https://www.cnblogs.com/mo3408/p/12394003.html

Python协程的引入与原理分析

故事扮演 提交于 2020-03-02 03:52:40
相关概念 并发: 指一个时间段内,有几个程序在同一个 cpu 上运行,但是任意时刻只有一个程序在cpu上运行。比如说在一秒内cpu切换了100个进程,就可以认为cpu的并发是100。 并行: 值任意时刻点上,有多个程序同时运行在cpu上,可以理解为多个cpu,每个cpu独立运行自己程序,互不干扰。并行数量和cpu数量是一致的。 我们平时常说的高并发而不是高并行,是因为cpu的数量是有限的,不可以增加。 形象的理解:cpu对应一个人,程序对应喝茶,人要喝茶需要四个步骤(可以对应程序需要开启四个线程):1烧水,2备茶叶,3洗茶杯,4泡茶。 并发方式:烧水的同时做好2备茶叶,3洗茶杯,等水烧好之后执行4泡茶。这样比顺序执行1234要省时间。 并行方式:叫来四个人(开启四个进程),分别执行任务1234,整个程序执行时间取决于耗时最多的步骤。 同步 ( 注意同步和异步只是针对于I/O操作来讲的 )值调用IO操作时,必须等待IO操作完成后才开始新的的调用方式。 异步  指调用IO操作时,不必等待IO操作完成就开始新的的调用方式。 阻塞 指调用 函数 的时候,当前线程被挂起。 非阻塞 指调用 函数 的时候,当前线程不会被挂起,而是立即返回。 IO多路复用   sllect, poll, epoll都是IO多路复用的机制。IO多路复用就是通过这样一种机制:一个进程可以监听多个描述符

轻量级协程库-C语言实现

混江龙づ霸主 提交于 2020-03-02 03:23:41
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法 “子例程是协程的特例” ,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。只不过子例程只有一个调用入口起始点,返回之后就结束了,而协程入口既可以是起始点,又可以从上一个返回点继续执行,也就是说协程之间可以通过 yield 方式转移执行权, 对称(symmetric)、平级 地调用对方,而不是像例程那样上下级调用关系。当然 Knuth 的“特例”指的是协程也可以模拟例程那样实现上下级调用关系,这就叫 非对称协程 (asymmetric coroutines)。 基于事件驱动模型 我们举一个例子来看看一种 对称协程 调用场景,大家最熟悉的“生产者-消费者”事件驱动模型,一个协程负责生产产品并将它们加入队列,另一个负责从队列中取出产品并使用它。为了提高效率,你想一次增加或删除多个产品。伪代码可以是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 # producer coroutine loop while queue

多线程,协程,进程;并发,并行;异步;非阻塞;

时光总嘲笑我的痴心妄想 提交于 2020-03-01 15:35:34
进程: 是资源分配的最小单位; ² 调度由操作系统完成; ² 进程空间独立,数据安全性好,有专门的进程间通信方法 ² 进程的创建和删除要比线程消耗更多的计算机资源 ² 有独立的内存空间(上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息,开销大) 1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立 2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制 线程: 是程序执行的最小单位(资源调度最小单位); ² 一个进程可以有多个线程,每个线程会共享父进程的资源(创建线程开销占用比进程小很多,可创建的数量也会很多) ² 线程的使用会给系统带来上下文切换的额外负担; ² 一个进程可以包含多个线程,线程共享进程的资源空间 1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源 2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃 协程: ² 调度完全由用户控制; ² 一个线程(进程)可以有多个协程; ² 每个线程(进程)循环按照指定的任务清单顺序完成不同的任务(当任务被堵塞时,执行下一个任务;当恢复时,再回来执行这个任务;任务间切换只需要保存任务的上下文,没有内核的开销,可以不加锁的访问全局变量)

asyncio+aiohttp异步爬虫

こ雲淡風輕ζ 提交于 2020-03-01 15:14:01
概念 进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。进程是操作系统动态执行的基本单元。 线程:一个进程中包含若干线程,当然至少有一个线程,线程可以利用进程所拥有的资源。线程是独立运行和独立调度的基本单元。 协程:协程是一种用户态的轻量级线程。协程无需线程上下文切换的开销,也无需原子操作锁定及同步的开销。 同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的。 异步:为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步的。 多进程:多进程就是利用 CPU 的多核优势,在同一时间并行地执行多个任务。多进程模式优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程,但是操作系统能同时运行的进程数是有限的。 多线程:多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。 Python 中使用协程最常用的库莫过于 asyncio ,然后我们还需要了解一些概念: event_loop 事件循环 程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数 coroutine 协程 协程对象,指一个使用async关键字定义的函数

协程

筅森魡賤 提交于 2020-03-01 10:59:07
协程的初识 协程本质上就是一个线程 一个线程实现并发.如果协程中处理的所有任务都遇到了阻塞 协程就会停止 只有阻塞完成会切回来 进程间是由操作系统调控cpu 而协程是由我们自己书写的程序调控的 单个cpu : 10个任务,让你给我并发的执行这个10个任务: 方式一:开启多进程并发执行, 操作系统切换+保持状态. 方式二:开启多线程并发执行,操作系统切换+保持状态. 方式三:开启协程并发的执行, 自己的程序 把控着cpu 在3个任务之间来回切换+保持状态. 协程他切换速度非常快,蒙蔽操作系统的眼睛,让操作系统认为cpu一直在运行你这一个线程(协程.) 单核心下处理多任务最好的方式 协程 开销小. 运行速度快. 协程会长期霸占cpu只执行我程序里面的所有任务. 并发的本质:就是切换+保持状态. 协程处理IO密集型, 计算密集型,还是串行好. 什么是协程? 单个线程并发的处理多个任务. 程序控制协程的切换+保持状态. 协程的特点: 必须在只有一个单线程里实现并发 修改共享数据不需加锁 用户程序里自己保存多个控制流的上下文栈(保持状态) 附加:一个协程遇到IO操作自动切换到其它协程 工作中: ​ 一般在工作中我们都是进程+线程+协程的方式来实现并发,以达到最好的并发效果,如果是4核的cpu,一般起5个进程,每个进程中20个线程(5倍cpu数量),每个线程可以起500个协程

PHP协程入门详解

╄→尐↘猪︶ㄣ 提交于 2020-03-01 03:56:54
概念 咱们知道多进程和多线程是实现并发的有效方式。但多进程的上下文切换资源开销太大;多线程开销相比要小很多,也是现在主流的做法,但其的控制权在内核,从而使用户(程序员)失去了对代码的控制,而且线程的上下文切换也是有一定开销的。 这时为了解决以上问题,"协程"(coroutine)的概念就产生了。你可以将协程理解为更轻量级的线程。这种线程叫做“用户空间线程“。协程,有下面两个特点: 协同。因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换 在用户态完成创建,切换和销毁 PHP对协程的支持是在 迭代生成器 的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数)。 这就把生成器到调用者的单向通信转变为两者之间的双向通信。 迭代器 迭代器的概念这里就不赘述了。下面看看我们自己实现的一个迭代器。 class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { // 第一次迭代时候会执行(或调用该方法的时候),后面的迭代将不会执行。 echo "rewinding\n"

Python----多任务----协程

被刻印的时光 ゝ 提交于 2020-02-29 20:49:48
Python学习之路,点击有全套Python笔记 协程是什么 简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态. 迭代器 迭代器就是用于迭代操作(for 循环的对象),它像列表一样可以迭代获取其中的每一个元素,任何实现了__next__方法的对象都可以称为迭代器。 它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算方式返回元素。它并没有把所有元素装在到内存中,而是等到调用next方法的时候才返回元素 生成器 方法一:把列表生成器的[]改成() 方法二:只要函数里有yield关键字,就被称为生成器 yield关键字有两点作用: 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数) Python3中的生成器可以使用return返回最终运行的返回值。 # 用yield实现协程 import time def task_1 ( ) : while True : print ( "-----1-----" ) time . sleep ( 0.1 ) yield def task

python中的进程、线程(threading、multiprocessing、Queue、subprocess)

末鹿安然 提交于 2020-02-28 01:12:36
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然。你做到了你就比别人NB。 我们先了解一下什么是进程和线程。 进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机

进程,线程,协程的区别

谁说我不能喝 提交于 2020-02-27 13:19:43
都可以提高并发能力 进程和线程是计算机中真是存在的,而协程是程序员人为创造出来的 #是什么 进程是计算机资源分配的最小单位. 线程是计算机中可以被cpu调度的最小单位. 协程也可以称为“微线程”,实际上让一个线程轮番执行一些任务 #联系 一个进程中可以有多个线程,同一个进程中的线程可以共享此进程中的资源, 一个线程可以有多个协程, 一个应用程序中至少有一个进程,一个进程中至少有一个线程 #应用场景 在Python中因为有GIL锁,他同一时刻保证一个进程中只有一个线程可以被cpu调度,所以在使用Python开发时要注意: 计算密集型,用多进程. IO密集型,用多线程/协程+IO操作 单纯的协程没办法提高并发,只是代码之间的切换,加上IO自动切换才能有意义 默认进程之间无法进行资源共享,如果主要想要通讯可以基于:文件/网络/Queue. 资源浪费 进程>线程>协程+IO切换 节省时间 进程≈线程≈协程+IO操作<串行操作 形象的关系 工厂 -> 应用程序 车间 -> 进程 工人 -> 线程 螺丝钉->协程 来源: CSDN 作者: 封凌寒武 链接: https://blog.csdn.net/zflhw/article/details/104532906