从Erlang进程看协程思想
从Erlang进程看协程思想
多核慢慢火了以后,协程类编程也开始越来越火了。比较有代表性的有Go的goroutine、Erlang的Erlang进程、Scala的actor、windows下的fibre(纤程)等,一些动态语言像Python、Ruby、Lua也慢慢支持协程。
其实我们听过协程相关很多名词,下面大致来解释一下:
- OS进程: 进程是资源管理的最小单元,包括进程控制块(PCB)、程序段、数据段
 - OS线程: 线程是程序执行的最小单元,由线程ID,当前指令指针(PC),寄存器集合和堆栈组成;内核线程之间切换的时候需要在内核态进行上下文和堆栈切换。
 - 轻量级进程(LWP): 其实是基于内核线程的高级抽象,每个LWP对应一个实际的线程。优点是在某些情况下不需要新建一个实际进程那么大开销。
 - 协程: 在不同的编程语言或库里因为实现方式差异,也叫纤程、actor等。实际可以理解为应用程序级别的线程,其调度器不是内核的CPU,而是由用户级别实现的VM级别调度器。
 
也就是说,协程具有以下特点:
- 协程并发时的切换基本在用户态级别切换,不会触发内核,减少系统开销
 - 尽管协程实际肯定还是在某个OS线程上执行,但是如何执行、何时执行、在哪个线程上执行等都是由用户的调度器去决定的,即协程使用者无需关心底层线程的情况。
 - 协程作为用户级别的存在,实际就是一段待执行的函数,创建销毁开销很小;且因为切换基本在用户态,所以可以很轻易地在一个进程内开百万级别的协程。
 
基本能满足以上特点的我们都可以称其为协程(coroutine)。
但不同语言却有不同实现方式,其中主要有以erlang为代表的 actor model,还有以Go为代表的Coroutine。
Go那边不太熟悉,不过主要就是协程间通信方式和yield主动让出CPU操作,这些在Python、Ruby等中也有实现。
Erlang以及Scala主要采取的是一种 actor model,也叫面向actor的编程。主要遵循以下特点:
- 一切皆Actor的思想,即每一个执行者都当做一个actor。(有点像Java每一个功能承担者都是一个对象类)
 - Actor之间只能允许通过消息传递来通信,不共享内存,且消息传递无副作用(无副作用指不会被脏读或修改等问题困扰)。
 - Actor的收发消息是异步的,接收到的消息一般是一份副本。
 
从他的特性看来,Actor是一种比普通Coroutine更彻底的一种面向并发的编程模型。在设计actor model的程序时,开发者只需要考虑如何利用并发特性使自己程序的并发性能更好,而不需要去考虑锁、冲突、不一致性等问题。
从Erlang进程看协程思想的更多相关文章
- 进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】
		
本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到"协程"的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开 ...
 - 进程、线程、轻量级进程、协程和go中的Goroutine
		
进程.线程.轻量级进程.协程和go中的Goroutine 那些事儿电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程 ...
 - 以goroutine为例看协程的相关概念
		
转自 http://wangzhezhe.github.io/blog/2016/02/17/golang-scheduler/ 基本上是网上相关文章的梳理,初衷主要是想了解下golang中的gor ...
 - 进程、线程、轻量级进程、协程与 go 的 goroutine
		
本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到“协程”的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开发时也经常用,但是协 ...
 - Python之线程、进程和协程
		
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
 - python运维开发(十一)----线程、进程、协程
		
内容目录: 线程 基本使用 线程锁 自定义线程池 进程 基本使用 进程锁 进程数据共享 进程池 协程 线程 线程使用的两种方式,一种为我们直接调用thread模块上的方法,另一种我们自定义方式 方式一 ...
 - 进程&线程&协程
		
进程 一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...
 - Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
		
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
 - Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
		
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
 
随机推荐
- rocketmq生产者和消费者
			
1.生产者: package com.ebways.mq.test.mq; import com.alibaba.rocketmq.client.exception.MQClientException ...
 - RIDE -- Robot Framework setup
			
RobotFramework 是一款基于python 的可以实现关键字驱动和数据驱动并能够生成比较漂亮的测试报告的一款测试框架 这里使用的环境是 python-2.7.10.amd64.msi RID ...
 - ABAP 常见查询问题解决方法
			
在ABAP 编程的时候会遇到查询单条语句的时候数能取对 但是条目数多了的话 会出现数不准确的问题 原因可能出现在查询使用了二分法查询方式 二分法查询下必须按排序的字段排序 还得按照排序的字段 ...
 - C#网络编程数据传输中封装数据帧头的方法
			
在C/S端编程的时候,经常要在C端和S端之间传数据时自定义一下报文的帧头,如果是在C/C++,封装帧头是一件很简单的事情,直接把unsigned char *强转为struct就行,但是在C#中,并没 ...
 - adb 的使用
			
打出log:adb logcat -s fliterName ps:(fliterName就是你的tag)
 - Maven创建工程 WEB
			
http://www.zuidaima1.com/blog/1618180875144192.htm http://www.zuidaima1.com/blog/1618162161323008.ht ...
 - python3 与 pip3 安装与使用
			
1. yum -y install openssl* (pip依赖ssl环境) 2.编译安装python3 下载地址:https://www.python.org/ftp/python/ .tgz c ...
 - Java基础学习(三)
			
/* java中的八种基本数据类型: 整数: byte . short . int . long 小数: float double 字符: char 布尔: boolean 字符串的类型: Strin ...
 - oracle 11.2.0.4单实例文件系统安装与补丁
			
[TOC] 一,预安装处理 1.版本准备 操作系统:RHEL 6.5 数据库版本:Oracle 11.2.0.4 相关包:p13390677_112040_Linux-x86-64_1of7.zip ...
 - EF不能很好的支持DDD?估计是我们搞错了!
			
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在ABP项目中尝试纯粹的DDD,然后遇到EF实现的Repository似乎不能很好 ...