协程

Lua Coroutine详解

大憨熊 提交于 2020-01-12 23:42:35
协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。 一、 lua协程函数概览 方法 描述 coroutine.create() 创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用 coroutine.resume() 重启coroutine,和create配合使用 coroutine.yield() 挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果 coroutine.status() 查看coroutine的状态.注:coroutine的状态有四种:dead,suspend,running,normal coroutine.wrap() 创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复 coroutine.running() 返回正在跑的coroutine,一个coroutine就是一个线程

同步,异步 阻塞,非阻塞, 异步+回调机制 线程队列 事件Event 丶协程

大兔子大兔子 提交于 2020-01-11 16:08:59
day36 一丶同步,异步 同步: 所谓同步就是一个任务需要依赖另一个任务时,只有被依赖任务执行完毕之后,依赖的任务才会完成.这是可靠的任务序列.要么都成功,要么失败,两个任务的状态可以保持一致. 异步: 所谓异步不需要等待被依赖的任务完成,只是通知依赖的任务要完成什么工作.依赖的任务也立即执行,只要自己完成了整个任务就算完成了. 至于被依赖的任务是否完成,依赖它的任务无法确定,是不可靠的任务序列 ### 同步和异步## 比如我去银行办理业务,可能会有两种方式:# 第一种 :选择排队等候;# 第二种 :选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;​# 第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;​# 第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。 二丶阻塞,非阻塞, 阻塞和非阻塞两个概念与程序(也就是执行程序的'线程')等待消息通知时的状态相关 阻塞: 在程序中,阻塞代表程序'卡'在某处,必须等待这处执行完毕才能继续执行. 通常的阻塞大多数是IO阻塞 比如:银行排队取钱是一条流水线

编程通用知识 系统编程

半城伤御伤魂 提交于 2020-01-11 08:04:04
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行. 进程并发 进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。 缺点: 1:系统开销比较大,占用资源比较多,开启进程数量比较少。 2:在unix/linux系统下,还会产生“孤儿进程”和“僵尸进程”。 线程并发 LWP:light weight process 轻量级的进程,本质仍是进程 (Linux下) 进程:独立地址空间,拥有PCB,最小的资源分配单位 线程:没有独立的地址空间(共享),有独立的PCB,最小的cpu执行单位 缺点: 产生的现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要同步。“多个控制流,共同操作一个共享资源”的情况,都需要同步。 协程并发 1.协程:coroutine,一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源。 2.进程和线程都是由系统调用,而协程是由开发者或者语言 3.进程和线程在调用函数时,函数是放在栈中,而协程不是,不同的函数可以协同执行 4.线程的调度是抢占式的而协程的是协作式(程序员或语言控制函数的切换时机(暂停、恢复函数)) 协程实现 1.lua 从5

8.1Go并发

时光毁灭记忆、已成空白 提交于 2020-01-10 08:44:01
第八章 Go并发 Go语言区别于其他语言的一大特点就是出色的并发性能,最重要的一个特性那就是 go 关键字。 并发场景: UI小姐姐一边开着PS软件,一边微信疯狂的和产品经理打字交流,后台还听着网易云音乐。。 双11当天。。大伙疯狂的访问淘宝网站 CPU从单核向多核发展,计算机程序不该是串行的,浪费资源 串行程序由于IO操作被阻塞,整个程序处于停滞状态,其他IO无关的任务无法执行 并发必要性: 充分利用CPU核心的优势,提高程序执行效率 实现并发的模型: 多进程,多进程是在操作系统层面并发的基本模式,进程间互不影响,但是开销最大,进程由内核管理。 多线程,属于系统层面的并发模式,也是用的最多的有效模式,大多数软件使用多线程,开销小于多进程。 基于回调的非阻塞/异步IO。此架构处于多线程模式的危机,高并发服务器下,多线程会消耗殆尽服务器的内存和CPU资源。而通过事件驱动的方式使用异步IO,尽可能少用线程,降低开销,Node.js就是如此实践,但是此模式编程复杂度较高。 协程,Coroutine是一种用户态线程,寄存于线程中,系统开销极小,可以有效提高线程任务并发性,使用方式简单,结构清晰,避免多线程的缺点。需要编程语言的支持,如不支持,需要用户自行实现调度器。 共享内存系统 是比较常用的并发模式,线程之间通信采用共享内存的方式,程序员需要加锁等操作避免死锁、资源竞争等问题。

网络编程进阶:并发编程之协程、IO模型

三世轮回 提交于 2020-01-10 06:56:57
协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发; 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制),一种情况是该任务发生了阻塞,另一种是该任务计算的时间过长或有一个优先级更高的程序替代了它 在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 如果多个任务都是纯计算的,上图的情况2并不能提升效率,因为只是让CPU来回切,这样看起来所有任务都被“同时”执行的效果,此时这种切换反而会降低效率; yield本身就是一种在单线程下可以保存任务运行状态的方法,其特点如下:   1. yield可以保存状态,yield的状态保存于操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级   2. send可以把一个函数的结果传递给另外一个函数,以此实现单线程内程序之间的切换;yield并不能实现遇到io切换 在任务1遇到io情况下,切到另外一个任务去执行,这样就可以利用任务1阻塞的时间完成其他任务的计算,效率的提升就在此处 对于单线程下,我们不可避免程序中出现io操作,如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另一个任务去计算

深入理解:线程,进程,协程和并行,并发-协程

岁酱吖の 提交于 2020-01-10 02:27:20
爬虫的并发控制: 多进程、多线程、协程 yield 从硬件: 双核四线程(超线程技术): 有两个CPU核心,每个核心有两个逻辑处理器,相当于有四个CPU核心 四核四线程: 有一个CPU核心,每个核心有一个逻辑处理器,相当于有四个CPU核心 从操作系统: 进程和线程,都是CPU任务的执行单位。 进程:早期的操作系统是面向进程的: 表示一个程序的执行活动(打开、执行、保存、关闭) 线程:现在的操作系统都是面向线程: 表示一个进程处理任务时最小调度单位(执行功能a、执行功能b) 一个程序至少开启一个进程,一个进程至少有一个线程。 每个进程都有独立的内存空间,不同进程之间不共享任何状态。 进程之间的通信需要经过操作系统调度控制,通讯效率低、切换开销大。 同一个进程里的多个线程,是共享内存空间,切换开销小,通讯效率高。 线程的工作机制是"抢占式",出现竞争的状态,竞争意味着数据不安全。 引入了"互斥锁":让多个线程安全有序的访问内存空间的机制。 Python的多线程: 类似于 GIL(全局解释器锁):保证一个时间片里只有一个线程在运行。 好处:直接杜绝了多个线程的竞争问题: 坏处:Python的多线程不是真正的多线程。 Python解释器在处理IO阻塞类型的方法时,会释放GIL 如果没有IO操作,该线程会每隔 sys.getcheckinterval() 次释放GIL,让其他线程尝试执行。

协程gevent模块和猴子补丁

亡梦爱人 提交于 2020-01-09 10:35:22
一、协程定义 协程其实可以认为是比线程更小的执行单元。 为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。 二、协程切换和线程切换对比 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。 三、协程带来的问题 协程有一个问题,就是系统并不感知,所以操作系统不会帮你做切换。 那么谁来帮你做切换?让需要执行的协程更多的获得CPU时间才是问题的关键。 举个例子如下: 目前的协程框架一般都是设计成 1:N 模式。所谓 1:N 就是一个线程作为一个容器里面放置多个协程。 那么谁来适时的切换这些协程?答案是有协程自己主动让出CPU,也就是每个协程池里面有一个调度器, 这个调度器是被动调度的。意思就是他不会主动调度。而且当一个协程发现自己执行不下去了(比如异步等待网络的数据回来,但是当前还没有数据到), 这个时候就可以由这个协程通知调度器,这个时候执行到调度器的代码,调度器根据事先设计好的调度算法找到当前最需要CPU的协程。

python----线程进程协程

余生颓废 提交于 2020-01-09 08:35:00
python线程: import threading import time def show(arg): time.sleep(1) print('thread' + str(arg)) for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start() print('main thread stop') import threading class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): print("线程开始运行") t1 = MyThread() t1.start() 通过类创建线程 更多方法: start 线程准备就绪,等待CPU调度 setName 为线程设置名称 getName 获取线程名称 setDaemon 设置为后台线程或前台线程(默认) t.setDaemon(True) 必须在 t.start() 之前调用 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止 join

线程、进程和协程

∥☆過路亽.° 提交于 2020-01-09 04:09:29
Treading用于提供线程相关的操作,线程是应用程序中工作的最小单元 #!/usr/bin/env python # coding:utf-8 import threading import time def show(arg): time.sleep(1) print 'thread'+str(arg) for i in range(10): t = threading.Thread(target=show,args=(i,)) t.start() print 'main thread stop' ''' 打印结果: main thread stop thread0 thread5thread4thread1thread2 thread3 thread7thread6thread8 thread9 ''' 上述代码创建了10个进程,然后控制器就交给CPU,CPU根据指定的算法进行调度,分片执行指令。出现顺序错乱的现象正常,因为他们都在同时抢占屏幕。 更多方法: start 线程准备就绪,等待CPU调度 setName 为线程设置名称 getName 获取线程名称 setDaemon 设置为后台线程或前台线程(默认) 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 如果是前台线程,主线程执行过程中,前台线程也在进行

Go并发编程

一个人想着一个人 提交于 2020-01-08 10:50:05
概述 简而言之,所谓并发编程是指在一台处理器上“同时”处理多个任务。 随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会在后台执行各种计算任务和网络请求。即使是传统的批处理问题--读取数据,计算,写输出--现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心。计算机的性能每年都在以非线性的速度增长。 宏观的并发是指在一段时间内,有多个程序在同时运行。 并发在微观上,是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个程序快速交替的执行。 并行和并发 并行(parallel) :指在同一时刻,有多条指令在 多个处理器 上同时执行。 并发(concurrency) :指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,通过cpu 时间片轮转 使多个进程快速交替的执行。 大师曾以咖啡机的例子来解释并行和并发的区别。 并行 是两个队列 同时 使用 两台 咖啡机 (真正的多任务) 并发 是两个队列 交替 使用 一台 咖啡机 ( 假 的多任务)