线程通信机制

在讲解什么是 Actor 之前,先来说说线程通信机制。我们知道,系统中执行任务的最小单元是线程,线程间的通讯一般有2种方式:

  1. 共享内存
  2. 消息传递

共享内存就是不同线程访问同一个逻辑内存,而消息通讯就好比发短信,发邮件。

共享内存

共享内存这种方式比较常见,经常会有一个共享变量,然后多个线程去操作同一个共享变量,从而达到线程通讯的目的。

例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量 count 来记录任务完成的数量,每当一个线程完成抓取任务,会在原来的 count 上执行加1操作,这样每个线程都可以通过获取这个 count 变量来得知当前任务的完成情况,当然必须要考虑的是共享变量的同步问题(加锁)。

这种通讯模型中,不同的线程之间是没有直接联系的,都是通过共享变量这个“中间人”来进行交互,而这个“中间人”有时还需被保护在临界区内(加锁)。由此可见,一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种方式极容易出现问题。

消息传递

消息传递方式采取的是线程之间的直接通信,不同的线程之间通过显式的发送消息来达到交互目的。消息传递最有名的方式应该是 Actor 模型了。
还是那面那个加1的例子,首先我们定义一个统计 Actor 用来统计任务完成量,然后把多个网址(消息方式)发给多个抓取 Actor,抓取 Actor 处理完任务后发送消息通知统计actor任务完成,统计 Actor 对自己保存的变量 count(统计 Actor 私有)加1。

总结

  1. 共享内存,通过写-读共享内存来隐式进行通信,同步是显式进行的,互斥必须显式指定。
  2. 消息传递,通过明确的发送消息来显式进行通信,消息的发送在消息的接收之前,同步是隐式进行的。