【erlang】并发篇

news2024/12/26 22:47:22

PID类型

在之前的语法篇中,我们并没有介绍 PID这个类型,它和并发息息相关,因此我们在这里来学习它。

PID是进程标识符的意思,用来标识一个erlang进程。在所有相连的erlang节点中,PID都是唯一的。但是PID会被复用,当一个进程终止后,它的PID可以被其他进程再次使用。

进程ID用尖括号包裹的3个点分十进制表示 <x.y.z>,每个分量是一个十进制数字,一般 xz都是零,如果是一个远端主机上的进程的话,x就不为0了。

通过 self/0函数可以获取进程自己的PID,is_pid/1函数可以用来判断一个值是否是PID。

1> is_pid(1).
false
2> is_pid(<0.58.0>).
true
3> self().
<0.80.0>
4> is_pid(self()).
true

并发

erlang中并发的基本单元是函数,实现并发的函数是 spawn,它有两种调用方式:

  • spawn(Mod, Func, Args)
  • spawn(Fun)

spawn会在一个新的进程中执行指定的函数,注意这里所说的"进程"并不是操作系统的进程,而是erlang的进程,这种进程非常轻量,因此可以做到非常高的并发量。这两种方式的区别是第一种支持动态代码升级,后者不支持。

span函数的返回值就是进程PID,通过这个PID我们就可以给该进程发送消息了,这也是erlang中进程间通信的唯一方式。

发送消息

向一个进程发送消息的操作符是 !,语法为 Pid ! Message。该表达式的结果任然是 Message,这就意味着 Pid1 ! Pid2 ! ... ! Message也是合法的表示式,它会把 Message发送给 Pid1Pid2等所有进程。

消息是异步发送的,不会阻塞发送进程。

接收消息

接收消息的语法如下:

receive
    Pattern1 [when Guard] ->
        Expressions1;
    Pattern2 [when Guard2] ->
        Expressions2;
    ...
end

receive是阻塞式的,当消息到达时,会和每个模式进行匹配,并进行关卡验证,验证通过就会执行对应的表达式。receive只会接收一次消息,如果要循环接收,就需要使用递归。

超时

receive是阻塞式的,为了防止无限期等待,有时我们需要超时的功能。带超时的接收语法如下:

receive
    Pattern1 [when Guard] ->
        Expressions1;
    Pattern2 [when Guard2] ->
        Expressions2;
    ...
after Time ->
    Expressions
end

Time的单位是毫秒。超时时间有3种类型:

  • Time=0,立即超时。
  • Time=有限正数,正常超时。
  • Time=infinity,永不超时。

注意这里“等待”的含义并不是“等待消息的到来”,而是等待匹配的消息!这也就是说,即便是进程收到了消息,但是不能匹配接收语句的话,超时还是会执行。如果在超时之前,收到了与接收语句匹配的消息,那么超时语句就不会执行。

receive语句中可以只包含超时,它会让进程挂起一段时间,比如我们可以用它来实现一个sleep函数。

sleep(T) ->
    receive
    after T ->
        true
    end.

另一点需要注意的是,即便是时间为0的超时,在执行超时语句之前,进程也会先将自己邮箱中的消息与接收语句匹配一遍,如果能够匹配,那么超时也不会执行。我们可以用一个例子来说明这一点。

-module(chaoshi).

-export([test_recv/0]).

test_recv() ->
    receive
        yes -> io:format("yyds~n")
    after 0 -> 
        test_recv2()
    end.

在erlang shell中编译上面的代码,然后执行下面的命令:

2> Pid = spawn(chaoshi, test_recv, []).
<0.116.0>
3> Pid ! yes.
yyds
yes

如果不是先对邮箱中的消息进行匹配,那么yyds是永远不可能被打印的。

receive的流程

receive除了做消息匹配还会做消息管理和超时管理,一个典型的接收语句如下:

receive
    Pattern1 [when Gruad1] ->
        Expression1;
    Pattern2 [when Gruad1] ->
        Expression2;
    ...
after
    Time ->
        ExpressionTimeout
end.

它的工作流程如下:

  1. 启动一个定时器(如果有after的话)。

  2. 取出进程邮箱的第一条消息,与各个模式匹配,如果匹配成功,将消息从邮箱移除,并执行模式后的表达式。

  3. 如果第一个消息不能和任何一个模式匹配,系统会将它从进程邮箱移出,放入一个队列保存起来,然后继续尝试第二条消息,重复这一过程直到找到匹配的消息或者邮箱为空。

  4. 如果所有消息都不匹配,则进程被挂起并重新调度,直到有新消息时到达时,才继续匹配新消息,队列里的消息不会重新匹配。

  5. 如果新消息匹配成功,队列里的消息会按原顺序重新放入邮箱,如果启动了定时器,会取消定时器。

  6. 如果定时器先到期了,就会执行ExpressionTimeout,并将队列里的消息按原顺序重新放回邮箱。

注册进程

向进程发送消息就需要知道进程的PID,而要记住一个进程的PID是比较难的,而且每次启动进程PID都会变化。

注册进程就是将一个PID和一个原子关联起来,并通过某种方式公布出去,相当于给进程取个名字,这样其他进程通过这个名字就可以给这个进程发送消息了。DNS域名解析以及微服务的服务注册都是相同的套路。

与进程注册有关的函数有4个:

  • register(Name, Pid)
    Name(原子类型)与 Pid关联,如果 Name已被注册,此次注册会失败。一旦注册成功,就可以通过 Name ! Message向进程发送消息。
  • unregister(Name)
    取消注册,移出与 Name关联的所有注册信息。如果注册进程崩溃,会自动取消注册(这真是太棒了)。
  • whereis(Name)->Pid | undefined
    检查 Name是否已被注册,如果是就返回进程PID,否则返回 undefined
  • registered()->[Name::atom()]
    返回系统里所有注册进程的名称列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零搭建一个 Level-2 快照数据的因子计算平台

因子挖掘是量化交易的基础。近年来&#xff0c;Python 是很多研究员进行数据分析和因子挖掘的主流工具。但是通过 Python 挖掘的有效因子在投产时&#xff0c;通常需要由 QUANT 团队的研究员将代码提交给 IT 团队&#xff0c;IT 团队用 C 代码转写后部署到生产环境&#xff0c;…

1. HTMLCSS

文章目录1 盒子模型&#xff1a;1.1 盒子属性导图1.2 边框属性导图1.3 定位导图&#xff1a;2 HTML常用标签2.1 基本标签① HTML基本结构② HTML常见标签③ 特殊字符④ 列表标签a 无序列表&#xff1a;b 有序列表&#xff1a;⑤ 表单3 CSS快速上手3.1 background属性① 思维导图…

自适应遗传算法求解TSP问题(Java)

1 引言 普通遗传算法&#xff08;Sample Genetic Algorithm, SGA&#xff09;存在着严重的缺点&#xff0c;它的Pc和Pm的值是固定的&#xff0c;本文采用自适应遗传算法进行求解TSP问题。不管是优良个体还是劣质个体都经过了相同概率的交叉和变异操作。这会引起两个很严重的问…

Linux驱动开发——高级I/O操作(二)

目录 proc文件操作 非阻塞型I/O 阻塞型I/O proc文件操作 proc 文件系统是一种伪文件系统&#xff0c;这种文件系统不存在于磁盘上&#xff0c;只存在于内存中只有内核运行时才会动态生成里面的内容。这个文件系统通常挂载在/proc 目录下&#xff0c;是核开发者向用户导出信息…

公司招人,面试了50+的候选人,技术实在是太烂了····

前两个月&#xff0c;公司测试岗位面了 50候选人&#xff0c;面试下来发现几类过不了的情况&#xff0c;分享大家防止踩坑&#xff1a; 技术倒是掌握得挺多&#xff0c;但只是皮毛&#xff0c;基础知识却是一塌糊涂。工作多年&#xff0c;从未学习过工作之外的技术栈&#xff…

ERTEC200P-2 PROFINET设备完全开发手册(7-1)

7. 配置模块及自定义模块 7.1.1 PN设备的基本模型 初次接触PN的开发者&#xff0c;最容易出现的错误就是设备的实际配置与TIA的组态不一致。为了开发的过程更加顺利&#xff0c;非常有必要掌握PN设备的基础模型。PN设备的基本模型如下图描述&#xff1a; PN设备的基本构成是插…

No.039<软考>《(高项)备考大全》【第23章】综合测试管理

【第23章】综合测试管理1 章节相关1.1 考试相关1.2 案例相关2 测试监控3 测试风险管理4 测试人员绩效考核4.1 测试分类测试类型分类执行方式分类开发阶段分类5 开发测试分类参考答案1 章节相关 1.1 考试相关 必考1分选择&#xff0c;案例概率低。 1.2 案例相关 2020年下半年…

关于IOS系统时间格式显示NAN问题以及小程序项目运行报错app.json找不到

目录 问题一&#xff1a;关于IOS系统时间格式显示NAN 一、比较常见的情况&#xff0c;时间格式为"yyyy-MM-dd HH:mm:ss"格式在 iOS 会出现 NAN 二、关于时间临界值&#xff1a;对于00:00:00和24:00:00这两个时间临界值, ios会转成NAN 三、时间格式为2022/09&#…

Java语法理论和面经杂疑篇《六.泛型(Generic)》

1. 泛型概述 1.2 泛型的引入 在Java中&#xff0c;我们在声明方法时&#xff0c;当在完成方法功能时如果有未知的数据需要参与&#xff0c;这些未知的数据需要在调用方法时才能确定&#xff0c;那么我们把这样的数据通过形参表示。在方法体中&#xff0c;用这个形参名来代表那…

Medical X-rays Dataset汇总(长期更新)

目录​​​​​​​ ChestX-ray8 ChestX-ray14 VinDr-CXR VinDr-PCXR ChestX-ray8 ChestX-ray8 is a medical imaging dataset which comprises 108,948 frontal-view X-ray images of 32,717 (collected from the year of 1992 to 2015) unique patients with the text-mi…

Nginx(下载安装、常用命令、反向代理、负载均衡)

官网&#xff1a;https://nginx.org/Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器,其特点是占有内存少&#xff0c;并发能力强。下载和安装下载在Nginx的官网的下载页面中(http://nginx.org/en/download.html)&#xff…

01、Cadence使用记录之新建工程与基础操作(原理图绘制:OrCAD Capture CIS)

01、Cadence使用记录之新建工程与基础操作&#xff08;原理图绘制&#xff1a;OrCAD Capture CIS&#xff09; 硕士学电磁场去了&#xff0c;写点博客记录下学习过程。 参考的教程是B站的视频&#xff1a;allegro软件入门视频教程全集100讲 本科的时候就对Cadence有所耳闻&am…

网络安全漏洞分析与漏洞复现

前言 4 月 6 日和 5 月 18 日&#xff0c;VMware 官方发布的两则安全公告中显示&#xff0c;关乎旗下产品的 CVE 漏洞多达 10 个&#xff0c;其中不乏有 CVSSv3 评分 9.8 的高危漏洞&#xff01;如此高频的出洞速率&#xff0c;吸引了笔者注意。笔者将对 CVE-2022-22954 VMwar…

用CTGAN生成真实世界的表格数据

随着CLIP和稳定模型的快速发展&#xff0c;图像生成领域中GAN已经不常见了&#xff0c;但是在表格数据中GAN还是可以看到它的身影。 现实世界的复杂性与许多方面相关(例如&#xff0c;缺失数据、不平衡数据、噪声数据)&#xff0c;但最常见的一个问题是包含异构(或“混合”)数…

软考电子商务设计师如何备考?

关于软考电子商务设计师考什么?如何备考&#xff1f; 一、电子商务设计师概述&#xff1f; 电子商务设计师属于软考中级资格考试&#xff0c;软考是由国家人力资源和社会保障部&#xff08;原人事部&#xff09;、工业和信息化部&#xff08;原信息产业部&#xff09;领导的…

使用Softing edgePlug软件扩展数控机床的连接性

那些使用SINUMERIK 840D控制器来运行数控机床的制造商正面临着一个挑战——从车间提取机床性能和过程数据来进行分析。这些数据对于优化流程至关重要&#xff0c;但它们却无法通过传统方式来被获取。对此&#xff0c;制造商的应对方法是通过自定义代码来实现数据访问&#xff0…

Redis与MySQL的双写一致性问题

Redis与MySQL的双写一致性问题更新缓存&#xff1f; 删除缓存&#xff1f;先更新缓存再更新数据库先更新数据库&#xff0c;再更新缓存先删除缓存再更新数据库先更新数据库&#xff0c;再删除缓存解决方案1. 重试2. 异步重试2.1 使用消息队列实现重试2.2 Binlog实现异步重试删除…

10万字智慧政务大数据治理平台解决方案(word)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1 项目整体建设规划方案 按照《省人民政府关于推进数字政府建设的指导意见》(鄂政发(2019) 4号&#xff09;的规则要求&#xff0c;结合XX市“互联网政府服务”建设现状&…

【Android笔记93】Android小案例(三)之模仿小米商城(首页商品展示界面)

这篇文章,主要介绍Android小案例(三)之模仿小米商城(首页商品展示界面)。 一、模仿小米商城(首页布局) 1.1、首页运行效果 这篇文章实现的首页布局界面如下所示: 1.2、实现思路 首页轮播图,这里采用一个Banner组件实现,不知道的可以看下我之前写的一篇文章【【And…

DUET详解草稿

详解VLN动机&#xff1a;流程拓扑图Text EncoderCoarse-scale Cross-modal EncoderNode embeddingGraph-aware cross-modal encodingGlobal action predictionFine-scale Cross-modal EncoderVisual EmbeddingFine-grained cross-modal reasoningLocal action prediction and o…