并发模型 Actor & CSP

并发和并行

并发的方案

  • 进程
  • 线程
  • 事件循环

进程 or 线程

线程遇到的问题

  • 竞争条件
  • 死锁
  • 执行顺序依赖

系统在多少线程下是最优的?

如何有效利用在阻塞期间的资源

  • 异步回调
  • GreenThread/Coroutine/Fiber

GreenThread/Coroutine/Fiber

  • 运行在用户空间,占用较少的资源,可以创建大量的实例
  • 异步回调会遇到,回调地狱问题
  • GreenThread/Coroutine/Fiber 需要手动的切换和管理

CSP

Go

  • 用goroutine作为做小执行单元
  • channel作为通讯通道
  • 语言层面实现goroutine调度器

Goroutine调度器

实现M:M

Actor

  • 通过发送消息,来共享资源
  • actor可以创建其他actor
  • actor可以接受并处理消息,及修改自身的状态
  • actor作为独立的实体可以热更新
  • 一个actor关掉的时候可以发送出消息通知其他的actor
  • 不区分本地和远程

Actor模型的实现

  • Erlang/Elixir
  • Akka(JVM)
  • Celluloid(ruby)

Golang CSP & Actor

  • CSP : Channel是主体,处理器是匿名的,实体和实体之间是松耦合的.
  • Actor: Actor是主体,MailBox是透明的,实体之间是紧耦合.

谢谢大家