我正在阅读SašaJurić撰写的《行动中的长生不老药》,在第一章中说:
Erlang进程彼此完全隔离。它们不共享内存,并且一个进程的崩溃不会导致其他进程的崩溃。
Java线程也不是真的吗?我的意思是,当Java线程崩溃时,它也不会崩溃其他线程-
尤其是,如果我们正在查看请求处理线程(请将该main
线程排除在此讨论之外)
在我之后重复: “这些是不同的范例”
大声说20次左右-这是我们目前的口头禅。
如果我们 真的 必须比较苹果和橙子,那么至少要考虑一下“成为水果”的共同方面在哪里相交。
Java“对象”是Java程序员的基本计算单位。也就是说, 对象 (基本上是具有臂和腿的结构,比C
++更严格地执行了
封装)是建模世界的主要工具。您认为“此对象知道/拥有Data {X,Y,Z}
并执行Functions {A(),B(),C()}
它,Data
随处携带它,并且可以通过调用定义为其公共接口一部分的函数/方法来与其他对象进行通信。它是一个名词,而名词
确实
也就是说,您将思考过程围绕这些计算单元进行。默认情况是,对象之间发生的事情是按顺序发生的,而崩溃会中断该顺序。它们被称为“对象”,因此被称为“对象”。
(如果不考虑艾伦·凯的本义),我们得到“面向对象”。
Erlang“过程”是Erlang程序员的基本计算单位。甲 过程
(基本上在它自己的时间和空间中运行的自包含顺序程序)是主要的工具,利用该模型厄兰格世界(1)。与Java对象定义封装级别相似,Erlang进程也定义了封装级别,但是对于Erlang而言,计算单位是
完全
彼此切断。您不能在另一个进程上调用方法或函数,也不能访问其中包含的任何数据,甚至一个进程都不能在与任何其他进程相同的定时上下文中运行,并且不能保证消息接收相对于其的顺序。到可能正在发送消息的其他进程。它们也可能完全在不同的行星上(并且想起来,这实际上是合理的)。它们可以彼此独立崩溃,而其他过程只有在故意选择要受到影响的情况下才会受到影响(甚至涉及消息传递:本质上是注册以接收来自死进程的自杀记录,而死进程本身并不能保证以任何形式到达相对于整个系统的顺序,您可能会选择也可能不会选择对此做出反应)。
Java用复合算法直接处理复杂性:对象如何协同工作以解决问题。它旨在在单个执行上下文中执行此操作,并且Java中的默认情况是顺序执行。Java中的多个线程表示多个正在运行的上下文,这是一个非常复杂的主题,因为不同时序上下文中的影响活动会相互影响(整个系统也是如此:因此,防御性编程,异常方案等)。用Java说“多线程”
意味着
与Erlang有所不同,事实上,这在Erlang中甚至从未提及,因为它始终是基本情况。请注意,Java线程暗示的是与时间有关的隔离,而不是与内存或可见引用有关的隔离-
Java中的可见性是通过选择私有和公开来手动控制的;系统的通用访问元素必须设计为“线程安全”和可重入的,通过排队机制进行排序,或者采用锁定机制。简而言之:调度是线程/并行Java程序中的手动管理问题。
Erlang在执行时间(调度),内存访问和引用可见性方面将每个进程的运行上下文分开,并通过 完全 隔离算法来简化算法的每个组件 __。
这不仅是默认情况,而且是此计算模型下唯一可用的情况。一旦您的处理序列的一部分超过了消息壁垒,就以永远不知道任何给定操作的顺序为代价,这是因为消息本质上都是网络协议,无法保证可以在给定的时间内执行任何方法调用上下文。这类似于为每个对象创建一个JVM实例,并且仅允许它们跨套接字进行通信-
这在Java中非常麻烦,但这是Erlang设计工作的方式(顺便说一句,这也是该概念的基础如果人们不赞成使用面向Web的包writing,那么编写“
Java微服务”一词便会引起这种流行语-默认情况下,Erlang程序是大量微服务)。所有关于权衡。
这些是不同的范例。我们可以找到的最接近的共性是,从程序员的角度来看,Erlang进程类似于Java对象。如果我们必须找到某种东西来将Java线程与之进行比较……那么,我们根本就不会在Erlang中找到类似的东西,因为Erlang中没有这样的可比概念。打败一匹死马:
这是不同的范例 。如果您使用Erlang编写一些非平凡的程序,这将变得显而易见。
请注意,我说的是“这些是不同的范式”,但还没有涉及OOP与FP的话题。“ Java思维”和“ Erlang思维”之间的区别比OOP与FP更为根本。
尽管Erlang的“面向并发”或“面向过程”的基础确实与Alan
Kay在创造“面向对象”一词时所想到的更接近(2),但这并不是重点。Kay的回答是,通过将Computron切成离散的块,可以降低系统的认知复杂性,因此必须进行隔离。Java做到这一点的方式从本质上讲仍然使它在本质上仍然是过程性的,但是围绕特殊语法在称为“类定义”的高阶调度闭包上构造代码。Erlang通过将每个对象的运行上下文分开来实现此目的。这意味着Erlang东西不能互相调用方法,而Java东西可以。这意味着Erlang东西可以独立崩溃,而Java东西则不能。这种基本差异产生了许多含义,因此就是“不同的范式”。权衡。
脚注:
问题内容: 在我阅读的问题中,我们建议在进程上使用线程,因为线程速度更快。我决定使用程序的线程来编辑Wikipedia中某个类别的文章。该程序获取要编辑的文章列表,然后将文章划分为10个线程。这样一来,我每分钟进行6-7次编辑,这与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例指定要处理的类别时,我看到每个进程每分钟可以进行6-7次编辑(我用5个进程进行了测试)。 为什么我的流程更快
线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程。 操作系统会为这些进程分配一些执行资源,例如内存空间等。 在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。 我们都知道现代操作系统比如 Mac OS X,UNIX,Linux,Windows 等可以同时运行多个任务。 打个比方,你一边在用浏览器上网,一边在听敲代码,一边用 Markdow
一、进程的状态与转换 运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。 就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。 阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。 注意区别就绪状态和等待状态: 就绪状态
1、进程的概念和特征 (1) 进程的概念 在多道程序环境下,允许多个程序并发执行,此时他们将失去封闭性,并具有间断性和不可再现性的特征。为此引入了进程的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发行和共享性。为此引入了进程的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。 为了是参与并发执行的程序能独立的运行,必须为之配置一个专门的数据结构,称之为进程控制块
9.3.2 进程与线程 操作系统控制处理器在多个程序之间切换执行的过程称为调度。传统的多任务操作系统是以进程为单位进行调度的。进程(process)是指程序的一次执行所形成的实体,每当程序 开始执行,就会创建一个进程。每个进程由程序代码以及一些状态信息(如进程数据的当前 值和当前执行点等)组成,状态信息也称为进程的上下文。 注意,程序与进程是不同的概念。首先,不同程序在计算机中执行,自然形成不同的
问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运