当前位置: 首页 > news >正文

Elixir学习笔记——进程(Processes)

在 Elixir 中,所有代码都在进程内运行。进程彼此隔离,彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础,而且还提供了构建分布式和容错程序的方法。

Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU 方面非常轻量级(甚至与许多其他编程语言中使用的线程相比也是如此)。因此,同时运行数万甚至数十万个进程并不罕见。

在本章中,我们将学习生成新进程的基本构造,以及在进程之间发送和接收消息。

生成进程

生成新进程的基本机制是自动导入的 spawn/1 函数:

spawn/1 接受一个函数,它将在另一个进程中执行。

注意 spawn/1 返回一个 PID(进程标识符)。此时,您生成的进程很可能已死。生成的进程将执行给定的函数,并在函数完成后退出:

注意:您可能会获得与我们在代码片段中显示的不同进程标识符。

我们可以通过调用 self/0 来检索当前进程的 PID:

当我们能够发送和接收消息时,进程会变得更加有趣。

发送和接收消息

我们可以使用 send/2 向进程发送消息,并使用 receive/1 接收消息:

当消息发送到进程时,该消息存储在进程邮箱中。receive/1 块会遍历当前进程邮箱,搜索与任何给定模式匹配的消息。receive/1 支持保护和许多子句,例如 case/2。

发送消息的进程不会在 send/2 上阻塞,它会将消息放入收件人的邮箱并继续。特别是,进程可以向自己发送消息。

如果邮箱中没有与任何模式匹配的消息,则当前进程将等待,直到匹配的消息到达。还可以指定超时:

当您已经预计消息在邮箱中时,可以指定 0 的超时。

让我们将所有内容放在一起并在进程之间发送消息:

inspect/1 函数用于将数据结构的内部表示转换为字符串,通常用于打印。请注意,当执行接收块时,我们生成的发送方进程可能已经死亡,因为它的唯一指令是发送消息。

在 shell 中,您可能会发现辅助程序 flush/0 非常有用。它会刷新并打印邮箱中的所有消息。

链接

大多数情况下,我们在 Elixir 中生成进程时,都会将它们生成为链接进程。在展示 spawn_link/1 的示例之前,让我们看看当使用 spawn/1 启动的进程失败时会发生什么:

它只是记录了一个错误,但父进程仍在运行。这是因为进程是孤立的。如果我们希望一个进程中的失败传播到另一个进程,我们应该将它们链接起来。这可以通过 spawn_link/1 完成:

由于进程是链接的,我们现在看到一条消息,表示父进程(即 shell 进程)已收到来自另一个进程的 EXIT 信号,导致 shell 终止。IEx 检测到这种情况并启动新的 shell 会话。

也可以通过调用 Process.link/1 手动完成链接。我们建议您查看 Process 模块以了解进程提供的其他功能。

进程和链接在构建容错系统时起着重要作用。Elixir 进程是独立的,默认情况下不共享任何内容。因此,进程中的故障永远不会崩溃或破坏另一个进程的状态。但是,链接允许进程在发生故障时建立关系。我们经常将进程链接到主管,主管将检测进程何时死亡并代替其启动新进程。

虽然其他语言会要求我们捕获/处理异常,但在 Elixir 中,我们实际上可以允许进程失败,因为我们希望监督者能够正确重新启动我们的系统。“快速失败”(有时称为“让它崩溃”)是编写 Elixir 软件时的常见理念!

spawn/1 和 spawn_link/1 是 Elixir 中创建进程的基本原语。虽然到目前为止我们只使用它们,但大多数时候我们将使用在它们之上构建的抽象。让我们看看最常见的一个,称为任务。

任务

任务建立在 spawn 函数之上,以提供更好的错误报告和自省:

我们使用 Task.start/1 和 Task.start_link/1 而不是 spawn/1 和 spawn_link/1,它们返回 {:ok, pid} 而不仅仅是 PID。这使得任务可以在监督树中使用。此外,Task 提供了便利函数,如 Task.async/1 和 Task.await/1,以及简化分发的功能。

我们将在“Mix 和 OTP 指南”中探索围绕流程的任务和其他抽象。

状态

到目前为止,我们还没有讨论过状态。如果您正在构建一个需要状态的应用程序,例如,保存应用程序配置,或者您需要解析文件并将其保存在内存中,您会将其存储在哪里?

进程是这个问题最常见的答案。我们可以编写无限循环、保持状态以及发送和接收消息的进程。作为示例,让我们编写一个模块,该模块启动新进程,这些进程在名为 kv.exs 的文件中作为键值存储:

请注意,start_link 函数启动一个运行 loop/1 函数的新进程,从一个空映射开始。然后,loop/1(私有)函数等待消息并对每条消息执行适当的操作。我们使用 defp 而不是 def 将 loop/1 设为私有。对于 :get 消息,它会将消息发送回调用者并再次调用 loop/1,以等待新消息。而 :put 消息实际上使用新版本的映射调用 loop/1,并存储给定的键和值。

让我们通过运行 iex kv.exs 来尝试一下:

首先,进程图没有键,因此发送 :get 消息然后刷新当前进程收件箱将返回 nil。让我们发送 :put 消息并重试:

请注意进程如何保持状态,我们可以通过发送进程消息来获取和更新此状态。事实上,任何知道上述 pid 的进程都可以向其发送消息并操纵状态。

还可以注册 pid,为其命名,并允许知道该名称的每个人都向其发送消息:

使用进程来维护状态和名称注册是 Elixir 应用程序中非常常见的模式。但是,大多数时候,我们不会像上面那样手动实现这些模式,而是使用 Elixir 附带的众多抽象之一。例如,Elixir 提供了 Agents,它们是围绕状态的简单抽象。我们上面的代码可以直接写成:

还可以为 Agent.start_link/2 提供 :name 选项,它将自动注册。除了代理之外,Elixir 还提供了用于构建通用服务器(称为 GenServer)、注册表等的 API,所有这些都由底层进程提供支持。这些以及监督树将在“Mix 和 OTP 指南”中进行更详细的探讨,该指南将从头到尾构建一个完整的 Elixir 应用程序。

现在,让我们继续探索 Elixir 中的 I/O 世界。

相关文章:

Elixir学习笔记——进程(Processes)

在 Elixir 中,所有代码都在进程内运行。进程彼此隔离,彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础,而且还提供了构建分布式和容错程序的方法。 Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU…...

困惑度作为nlp指标的理解示例

为了更清晰地说明困惑度的计算过程以及如何通过困惑度判断模型的优劣,我们可以通过一个简单的例子来演示。假设我们有一个非常简单的文本语料库和两个基础的语言模型进行比较。 示例文本 假设我们的文本数据包括以下两个句子: “cat sits on the mat”…...

01 Pytorch 基础

paddle不需要放数据到gpu! 区别:1.batch_norlization 不同 2. 1.数据处理 1.取一个数据,以及计算大小 (剩下的工作,取batch,pytorch会自动做好了) 2.模型相关 如何得到结果 3.模型训练/模型…...

STL——set、map、multiset、multimap的介绍及使用

文章目录 关联式容器键值对树形结构与哈希结构setset的介绍set的使用set的模板参数列表set的构造set的使用set的迭代器使用演示 multisetmultiset演示 mapmap的定义方式map的插入map的查找map的[ ]运算符重载map的迭代器遍历multimapmultimap的介绍multimap的使用 在OJ中的使用…...

使用C语言,写一个类似Linux中执行cat命令的类似功能

一、详细的代码案例 #include <stdio.h> #include <stdlib.h> #include <string.h>// 函数声明 void cat_file(const char *filename);int main(int argc, char *argv[]) {if (argc < 2) {fprintf(stderr, "Usage: %s filename1 [filename2 ...]\n&…...

【Android】Android系统性学习——Android系统架构

前言 部分内容参考《Android进阶解密》 – 刘望舒 1. Android版本 官方链接&#xff1a;https://developer.android.com/studio/releases/platforms 里面有各个版本的官方文档&#xff0c;有些新功能的用法在这里面。 现在做安卓11&#xff0c;有时候需要向下兼容 2. AOSP …...

鸿蒙应用开发

学习视频&#xff1a; 00.课程介绍_哔哩哔哩_bilibili 官网&#xff1a;开发者文档中心 | 华为开发者联盟 (huawei.com) 开发工具 &#xff1a;DevEcoStudio &#xff0c; 类似Jetbrains 全家桶 ArkTS开发语言 &#xff1a;&#xff08;基于TS,集成了前端语言&#xf…...

索引失效有效的11种情况

1全职匹配我最爱 是指 where 条件里 都是 &#xff0c;不是范围&#xff08;比如&#xff1e;,&#xff1c;&#xff09;&#xff0c;不是 不等于&#xff0c;不是 is not null&#xff0c;然后 这几个字段 建立了联合索引 &#xff0c;而且符合最左原则。 那么就要比 只建…...

字符数组基础知识及题目

死识。。。 字符该如何存储呢&#xff1f;这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢&#xff1f; char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢&#xff1f; char a[100002]; gets(a); gets是读入句子的&#xff0c…...

一个简单的玩具机器人代码

编写一个玩具机器人脚本通常取决于机器人的硬件、接口和具体功能。然而&#xff0c;由于我们不能直接控制一个真实的硬件机器人&#xff0c;所以只是写一个模拟的C语言脚本示例&#xff0c;该脚本描述了一个简单的玩具机器人可能执行的一些基本操作。 假设我们的“玩具机器人”…...

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…...

RK3588开发板中使用Qt对zip文件进行解压

操作步骤&#xff1a; 下载源码quazip-0.7.3.zip &#xff0c;在网上找找下载地址上传源码进行解压&#xff0c;然后使用命令 cd quazip-0.7.3 qmake make主要用的是quazip-0.7.3/quazip这个里面的源码&#xff0c;然后把源码加入到自己创建的qt项目pro中&#xff0c;导入方式…...

三、网络服务协议

目录 一、FTP&#xff1a;文件传输协议 二、Telnet&#xff1a;远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP&#xff1a;文件传输协议 C/S架构&#xff0c;现多用于企业内部的资料共享和网络设备的文件传输&#xff0c;企业内部搭建一…...

C++初学者指南第一步---1. C++开发环境设置

C初学者指南第一步—1. C开发环境设置 目录 C初学者指南第一步---1. C开发环境设置1.1 工具1.1.1 代码编辑器和IDE1.1.2 Windows1.1.3 命令行界面 1.2 编译器1.2.1 gcc/g (支持Linux/Windows/MacOSX)1.2.2 clang/clang (支持Linux/Windows/MacOS)1.2.3 Microsoft Visual Studio…...

二维数组与指针【C语言】

二维数组与指针 一维数组一维数组与指针二维数组二维数组与指针总结补充判断以下方式是否正确打印二维数组一维数组 int arr[] = {11, 22, 33, 44};arr:首地址(第一个元素的地址) 一维数组与指针 int arr[] = {11, 22, 33, 44};因为,arr表示的是首地址,等价于 int* p =…...

解决linux下安装apex库报错:ModuleNotFoundError: No module named ‘packaging‘

使用如下命令安装apex&#xff1a; git clone https://github.com/NVIDIA/apex cd apex pip install -v --disable-pip-version-check --no-cache-dir --global-option"--cpp_ext" --global-option"--cuda_ext" ./ 报错&#xff1a; Running command py…...

React基础教程(07):条件渲染

1 条件渲染 使用条件渲染&#xff0c;结合TodoList案例&#xff0c;进行完善&#xff0c;实现以下功能&#xff1a; 当列表中的数据为空的时候&#xff0c;现实提示信息暂无待办事项当列表中存在数据的时候&#xff0c;提示信息消失 这里介绍三种实现方式。 注意这里的Empty是…...

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限…...

操作系统——信号

将信号分为以上四个阶段 1.信号注册&#xff1a;是针对信号处理方式的规定&#xff0c;进程收到信号时有三种处理方式&#xff1a;默认动作&#xff0c;忽略&#xff0c;自定义动作。如果不是自定义动作&#xff0c;这一步可以忽略。这个步骤要使用到signal/sigaction接口 2.…...

力扣1482.制作m束花所需的最少时间

力扣1482.制作m束花所需的最少时间 二分答案 check的时候 用一个bool数组判断是否开花找连续的k朵花 const int N 1e510;int st[N];class Solution {public:int minDays(vector<int>& bloomDay, int m, int k) {int n bloomDay.size();if(n < (long long)m*…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...