ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 并行和并发总体概念 并发:在单核 CPU 系统中,系统调度在某一时刻只能让一个进程运行,虽然这种调度机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的进程让其运行的方式叫并发 并行:在多核 CPU 系统中,可以让两个以上的进程同时运行在不同的物理核心上,这种运行的方式就是并行 **区别** 并发在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,因为 CPU 计算速度很快,从宏观上看,好像这些进程都在同一个时间点执行 并行是真正的细粒度上的同时进行:既同一时间点上同时运行着多个进程 ## Actor模型 Actor模型描述了一组为了避免并发编程的常见问题的公里: 1、所有Actor状态是Actor本地的,外部无法访问; 2、Actor必须只有通过消息传递进行通信; 3、一个Actor可以响应消息:退出新Actor,改变其内部状态,或将消息发送到一个或多个其他参与者; 4、Actor可能会阻塞自己,但Actor不应该阻塞它运行的线程; Actors模型更多的使用消息机制来实现并发,目标是让开发者不再考虑线程这种东西,**每个Actor最多同时只能进行一样工作,Actor内部可以有自己的变量和数据**。 Actors模型避免了由操作系统进行任务调度的问题,在操作系统进程之上,多个Actor可能运行在同一个进程(或线程)中.这就节省了大量的Context切换. 在Actors模型中,每个Actor都有一个专属的命名”邮箱”, 其他Actor可以随时选择一个Actor通过邮箱收发数据,对于“邮箱”的维护,通常是使用发布订阅的机制实现的,比如我们可以定义发布者是自己,订阅者可以是某个Socket接口,另外的消息总线或者直接是目标Actor. ### Actor组件 ### 使用Actor模型实现 * skynet : 一个轻量级的游戏服务端框架 ## CSP(Communicating Sequential Processes)模型 Channel模型中,worker之间不直接彼此联系,而是通过不同channel进行消息发布和侦听。消息的发送者和接收者之间通过Channel松耦合,发送者不知道自己消息被哪个接收者消费了,接收者也不知道是哪个发送者发送的消息。 ### 使用CSP模型实现 * golang Go语言的CSP模型是有携程Goroutine与通道Channel实现: Go携程goroutine:是一种轻量线程,它不是操作系统的线程,而是一个操作系统线程分段使用,通过调度器实现协作式调度。是一种绿色线程,微线程,它与Gouroutine携程也有区别,能够在发现堵塞后启动新的微线程。 通道channel:类似Unix的Pipe,用于携程之间通讯和同步。携程之间虽然解耦,但是和它们Channel有着耦合。 ## Actor模型和CSP模型区别 * CSP进程通常是同步的(即任务被推送进Channel就立即执行,如果任务执行的线程正忙,则发送者就暂时无法推送新任务),Actor进程通常是异步的(消息传递给Actor后并不一定马上执行)。 * CSP中的Channel通常是匿名的, 即任务放进Channel之后你并不需要知道是哪个Channel在执行任务,而Actor是有“身份”的,你可以明确的知道哪个Actor在执行任务。 * 在CSP中,我们只能通过Channel在任务间传递消息, 在Actor中我们可以直接从一个Actor往另一个Actor传输数据。 * CSP中消息的交互是同步的,Actor中支持异步的消息交互。 Actor之间直接通讯,而CSP是通过Channel通讯,在耦合度上两者是有区别的,后者更加松耦合。 同时,它们都是描述独立的流程度过消息传递进行通信。主要的区别在于:在CSP消息交互是同步的(及两个流程的执行的‘接触点’,在它们交换消息处),而Actor模型是完全解耦的,可以在任意的时间将消息发送给人和未经证实的接受者。由于Actor享有更大的相互独立性,因为它们可以根据自己的状态选择处理哪个传入消息。自主性更大些。 在Go语言中为了不阻塞流程,程序员必须检查不同的传入消息,以便遇见确保正确的顺序。CSP好处是Channel不需要缓冲消息,而Actor理论上需要一个无限大小的邮箱作为消息缓冲。