学习 skynet 时初次接触到 ActorModel 模型,始终觉得有必要从宏观上了解 ActorModel 的概念,所以以维基上这篇文章为参考,把文章中的部分内容翻译成中文,好让自己体会一下 ActorModel 一些概念。再次说明,请原谅我蛋疼的翻译。

ActorModel

在计算机科学中,actor 模型是并发计算中的一种数学模型,它把 "actors" 作为并发计算的通用原语:响应它接收到的消息,一个 actor 自己可以决定自己的事务,可以创建更多的 actors ,发送更多的消息,决定如何响应下一条接收到的消息。actor 模型在1973年被提出。actor 模型既被作为理念来实现并行计算的框架,也被作为并发系统实现的理论基础。

历史

根据 Carl Hewitt ,ActorModel 不像其他计算模型,它启蒙于物理(包括广义相对论和量子力学)。ActorModel 同时也受到一些编程语言的影响:Lisp ,Simula ,Smalltalk 的早些版本,以及 capability-based systems 和 packet switching 。由许多机器组成的大规模并行计算前景促进了 ActorModel 的发展。之后,通过多核架构实现的大规模并发的到来复兴了 ActorModel 。维基这一段下面接着介绍了哪些牛人做了关于 ActorModel 的事情。

基本概念

ActorModel 的哲学是一切皆 actor 。这和面向对象的哲学 "一起皆 object " 类似,而两者的不同之处是面向对象程序是顺序执行的,ActorModel 程序是天然并发执行的。

actor 是一个计算实体,actors 可以并发的处理他们接收到的消息:

  • 发送消息给其他的 actors 。
  • 创建其他的 actors 。
  • 决定如何响应接收到的消息。

以上这些行为并没有特地的执行循序,有可能并发执行。

解耦消息的发送者是 ActorModel 的基本前提,这样可以进行并发通信和控制通信协议。

消息的接收者通过 address(地址) 标识,有时叫 "mailing address" 。因此一个 actor 只能和它拥有地址的 actor 进行通信,地址可以从它接收到的消息获得,也可以是它创建一个 actor 获得了此 actor 的地址。

ActorModel 的特征是 actors 之间固有的并发计算、动态创建 actors 、消息中标识发送者地址以及 actors 之间仅仅通过无序的异步消息进行通信。

消息传递机制

消息传递机制是 ActorModel 很主要的一部分。

Unbounded nondeterminism controversy

毫无疑问,第一个并发程序是中断程序。中断程序的执行需要来自外部的信号(来自键盘的按键、来自网络的数据包等等)。因此当信号到达时,计算机会被中断转而去执行中断程序。

在20世纪60年代早期,中断被用来模拟多个程序在一个处理器上的并发执行。带有共享内存的并发引出了并发控制问题。起初,这个问题被猜测是单台电脑上的相互互斥问题之一。之后在1971年和1973年之间,Edsger Dijkstra 提出了 semaphores 。Tony Hoare 和 Per Brinch Hansen 提出了 monitors 用来解决相互互斥问题。然而这些解决方案都没有提供程序语言上访问共享资源的支持。这种支持之后几年也被完成。

维基下面说明了 bounded nondeterminism 理论和 unbounded nondeterminism 理论。好多专业词汇,不懂翻译,所以就看看就好了。

Direct communication and asynchrony

ActorModel 不一定要缓存消息。没有消息的缓存在 ActorModel 发展时期引发了很多误解,到现在还是一个争论的话题。一些研究者认为消息应该缓存,而且消息应该像 IP 报文那样简单的发送,没有必要与接收者进行同步的握手(假设 A 要给 B 发送消息,这句话应该是指 A 直接发送消息给 B 就好,没有必要先发送握手消息到 B 告诉它我要给你发送消息,然后 B 返回告知 A 可以发送,最后 A 才发送真正的消息给 B )。

Actor creation plus addresses in messages means variable topology

虽然 ActorModel 的发展逐渐允许消息本身带有地址。

有时需要发送消息到接收者并等待接收者返回结果。要想接收者能返回结果,可以让发送者在消息中带有发送者的地址,这样接收者便能返回结果。

actor 的创建以及消息中带有地址意味着 actors 之间有着变化的拓扑,就像 Simula 编程语言中,对象之间有着变化的拓扑。

最后

在 skynet 中,一个服务就是一个 actor ,每个服务自身都有一个消息队列。对于同一个服务消息是顺序执行的,对于不同的服务消息是并发执行的。每个服务都有一个唯一的 id 标识自己,通过这个 id 就可以给这个服务发送消息。skynet 是的运行是靠消息驱动的,worker 线程不断的从消息队列中取出消息然后调用相应服务的 callback 函数处理消息。详情参考 skynet 源码。

ActorModel 概念翻译的更多相关文章

  1. OVN架构翻译

    概述 ovn-controller是OVN在虚拟机上的agent,北向连接OVN的南向数据库,学习OVN的配置和状态,并使用虚拟机的状态来填充PN表以及Binding表的Chassis列:南向连接op ...

  2. C#的变迁史 - C# 1.0篇

    C#与.NET平台诞生已有10数年了,在每次重大的版本升级中,微软都为这门年轻的语言添加了许多实用的特性,下面我们就来看看每个版本都有些什么.老实说,分清这些并没什么太大的实际意义,但是很多老资格的. ...

  3. 说说lambda表达式与表达式树(未完)

    Lambda表达式可以转换成为代码(委托)或者数据(表达式树).若将其赋值给委托,则Lambda表达式将转换为IL代码:如果赋值给 Expression<TDelegate>,则构造出一颗 ...

  4. 领域驱动设计(DDD)实现之路

    2004年,当Eric Evans的那本<领域驱动设计——软件核心复杂性应对之道>(后文简称<领域驱动设计>)出版时,我还在念高中,接触到领域驱动设计(DDD)已经是8年后的事 ...

  5. Speex manul中文版

    Speex manul中文版   在VOIP的音频算法中,回音处理已经成为一个关系通话质量的主要问题. 回声的产生在IP网络主要有两种:1.声学回声2.电路回声 声学回声主要又分成以下几种:a ) 直 ...

  6. 领域驱动设计(DDD)

    领域驱动设计(DDD)实现之路 2004年,当Eric Evans的那本<领域驱动设计——软件核心复杂性应对之道>(后文简称<领域驱动设计>)出版时,我还在念高中,接触到领域驱 ...

  7. Vue.js 实战总结

    最近在某个项目中用到了Vue.js,从上手做开发到项目发布,一步步踩了不少坑.本文试图总结过去一个多月使用Vue.js中的一些经验,也算是一点心得体会吧,拿出来与大家分享,欢迎多多交流. Vue.js ...

  8. OpenGL教程(3)——第一个三角形

    我们已经学会了创建窗口,这一讲,我们将学习如何使用现代OpenGL画一个三角形.在开始写代码之前,我们需要先了解一些OpenGL概念.本文会很长,请大家做好心理准备~ 注:以下OpenGL概念翻译自h ...

  9. 基于Neutron的Kubernetes SDN实践经验之谈

    首先,向大家科普下Kubernetes所选择的CNI网络接口,简单介绍下网络实现的背景. CNI即Container Network Interface,是一套容器网络的定义规范,包括方法规范.参数规 ...

随机推荐

  1. C语言之基本算法32—鞍点

    //数组 /* ================================================================== 题目:求随意矩阵的全部鞍点.并统计个数.(在矩阵中 ...

  2. 网络通信数据处理 Xbytestring类

    PS_Xbytestring a byte string for store low level data type 文件夹[TOC] PS_Xbytestring 文件夹TOC base info ...

  3. 初识Dubbo 系列之6-Dubbo 配置

    配置 Xml配置 配置项说明 具体配置项,请參见:配置參考手冊 (+) API使用说明 假设不想使用Spring配置.而希望通过API的方式进行调用,请參见:API配置 (+) 配置使用说明 想知道怎 ...

  4. 某个时间段关闭API

    def bet(): if 000000 < int(time.strftime("%H%M%S", time.localtime())) < 90000: print ...

  5. 【PyCharm编辑器】之报:Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click.问题

    如上图,输入一个单词时会出现波浪线,报:Spellchecker inspection helps locate typos and misspelling in your code, comment ...

  6. 用python实现入门级NLP

    今天看到一篇博文,是讲通过python爬一个页面,并统计页面词频的脚本,感觉蛮有意思的 Python NLP入门教程:http://python.jobbole.com/88874/ 本文简要介绍Py ...

  7. Sqlite 设置默认时间为本地时间

    Sqlite 设置默认时间为本地时间 先设置字段类型为datetime, 再把缺省值设置为datetime( 'now', 'localtime' ) 代码查看如下 Time DATETIME DEF ...

  8. 一种流量成本节省60%以上的手机直播微信直播H5直播幼儿园直播方案

    前言 近几年视频直播可以说是非常火热,EasyDarwin也非常受开发者的欢迎,不仅仅是主播火了,而且各种商业直播也火了起来:会场直播.宴会直播.讲座直播.景区直播.后厨直播.课堂直播.幼儿园直播等等 ...

  9. AWK命令使用

    前言 文本处理三剑客中,grep强在文本查找,sed强在文本处理,现awk强在文本查找后的输出处理.awk可以在处理文本的过程中使用编程结构(变量.条件判断.循环)以及其内置的变量,这就是它强大的地方 ...

  10. intellij idea jdk language level

    jdk的新的版本会兼容旧的版本. 如果安装了新的jdk,但是还是希望使用旧版本的特性,这个可以使用jdk language level来实现. 比如安装了jdk8,但是希望用7,那么language ...