关于WebSocket的一些总结
接口设计六大原则
Unity3D 2017.x Failed to start Unity Package Manager
ArkGameFrame开源跨平台游戏服务器框架0.2.0版本发布
说说协程coroutine
近几年来,协程的概念和使用被越多越多的人提到了,确实帮助很多人解决了很多问题,例如网络上的问题,异步逻辑流程控制等。我的工作中也接触到一些,所以打算总结下。
简单来说,协程就是一种用户态、编程语言层面的轻量级线程。
然而线程与协程又有很多差异的地方,线程是靠操作系统OS本身来调度,是抢占式的任务处理方式,谁抢到算谁的,所以大部分多线程程序中都要单独调用sleep来让出CPU给其他线程;线程每次阻塞、切换时都需要系统调用system call,然后调用调度函数来决定运行哪一个线程;协程拥有自己的用户态的上下文和栈(分为stackless和stackfulness,这个下一篇文章来讲),协程切换时,先将寄存器上下文和栈内容保存起来,再次切换回来的时候再恢复之前保存的内容继续运行;
通过上面的讲解,明白了一个道理,协程是编译器来保证的,线程是操作系统来调度的;协程能更好的保证流程,而线程需要仔细处理公共数据资源;协程本质是单线程的,能提高单个CPU core的性能,适合计算密集型的应用;协程切换非常轻量,所以能大量的使用,线程切换成本较高,一般要控制线程数。
协程的概念和原理明白了后,其实有点类似于异步事件驱动,可以看看libevent/libuv等经典的C语言库,发现大量使用了异步事件回调,有一个event_loop来循环检查要处理的事件,不过就是代码相对协程恶心了一些,协程能让用户以类似同步的方式来处理异步流程,更加便于理解。
不过协程也是有缺点的,无法利用现代多核机器的性能,所以还需要配合多进程来提高性能;有阻塞操作的时候依然会阻塞整个进程,需要用其他方式来解决。
……我为什么离开MK
[转]并发编程:Actors模型和CSP模型
一、前言
不同的编程模型与具体的语言无关,大部分现代语言都可以通过巧妙地结构处理实现不同的模型.杂谈的意思是很杂,想到哪儿写到哪儿,不对正确性负责 :D.
二、Actors模型
传统的并发模型主要由两种实现的形式,一是同一个进程下,多个线程天然的共享内存,由程序对读写做同步控制(有锁或无锁). 二是多个进程通过进程间通讯或者内存映射实现数据的同步.
Actors模型更多的使用消息机制来实现并发,目标是让开发者不再考虑线程这种东西,每个Actor最多同时只能进行一样工作,Actor内部可以有自己的变量和数据.
Actors模型避免了由操作系统进行任务调度的问题,在操作系统进程之上,多个Actor可能运行在同一个进程(或线程)中.这就节省了大量的Context切换.
在Actors模型中,每个Actor都有一个专属的命名”邮箱”, 其他Actor可以随时选择一个Actor通过邮箱收发数据,对于“邮箱”的维护,通常是使用发布订阅的机制实现的,比如我们可以定义发布者是自己,订阅者可以是某个Socket接口,另外的消息总线或者直接是目标Actor.
目前akka库是比较流行的Actors编程模型实现,支持Scala和Java语言.
三、CSP模型
CSP(Communicating Sequential Process)模型提供一种多个进程公用的“管道(channel)”, 这个channel中存放的是一个个”任务”.
目前正流行的go语言中的goroutine就是参考的CSP模型,原始的CSP中channel里的任务都是立即执行的,而go语言为其增加了一个缓存,即任务可以先暂存起来,等待执行进程准备好了再逐个按顺序执行.
四、CSP和Actor的区别
- CSP进程通常是同步的(即任务被推送进Channel就立即执行,如果任务执行的线程正忙,则发送者就暂时无法推送新任务),Actor进程通常是异步的(消息传递给Actor后并不一定马上执行).
- CSP中的Channel通常是匿名的, 即任务放进Channel之后你并不需要知道是哪个Channel在执行任务,而Actor是有“身份”的,你可以明确的知道哪个Actor在执行任务.
- 在CSP中,我们只能通过Channel在任务间传递消息, 在Actor中我们可以直接从一个Actor往另一个Actor传输数据.
- CSP中消息的交互是同步的,Actor中支持异步的消息交互.
五、参考文档
文章转载自:http://sobuhu.com/program/2014/09/07/concurrent-models.html
……