【go语言】CSP并发机制与Actor模型

一、多线程共享内存

1.  概念

多线程共享内存模型是一种并发编程模型,其中多个线程在同一个进程的地址空间中共享相同的内存区域。这种模型允许多个线程并发地读取和写入相同的数据结构,但也引入了一些潜在的问题,其中最常见的问题之一就是竞态条件(Race Condition)。

竞态条件(Race Condition)是多线程或多进程并发执行时,由于执行顺序不确定而导致程序的最终状态依赖于不同执行序列的结果的情况。这意味着多个线程或进程在访问和修改共享数据时,如果没有适当的同步机制,可能导致意外的结果。

竞态条件的经典示例是两个线程同时对共享变量进行读取-修改-写入操作。如果没有适当的同步机制,两个线程可能同时读取相同的值,然后基于相同的值进行修改,最终写入回去。由于执行的顺序不确定,可能导致最终结果不是期望的结果。

多线程共享内存模型的关键概念:

共享内存: 多个线程共享同一块内存区域,这使得它们可以直接访问和修改相同的数据结构。

并发执行: 多个线程可以同时执行,每个线程都有自己的执行路径,但它们可以同时访问共享的数据。

同步机制: 由于多线程同时访问相同的数据可能导致竞态条件,开发者需要使用同步机制来确保对共享数据的安全访问。这包括使用锁(mutex)、信号量(semaphore)、条件变量等。

2. 问题

竞态条件说白了就是多线程并发访问同一内存空间但是(竞态)缺少合适的同步机制导致的运行结果不确定。以下是竞态条件可能引发的一些典型问题:

  1. 临界区问题: 多个线程在同一时刻尝试进入或修改相同的临界区,导致数据不一致性。

  2. 数据竞争: 多个线程同时访问相同的内存位置,并且至少有一个线程进行写操作,可能导致未定义的行为或不稳定的结果。

  3. 死锁: 当线程相互等待对方释放资源,而无法继续执行时,就会发生死锁。死锁可能发生在多个线程试图获取相互依赖的锁时。

  4. 活锁: 类似于死锁,但线程不是被阻塞,而是一直在尝试解决冲突,导致系统无法取得进展。

  5. 饥饿: 某些线程可能由于竞争资源不公平而一直无法获得所需的资源,导致饥饿问题。​​​​​​​

避免竞态条件的办法,让他同步确定的执行:

  1. 锁和同步机制: 使用互斥锁(mutex)、信号量等同步机制来确保在任意时刻只有一个线程能够访问共享数据。

  2. 原子操作: 使用原子操作来确保某些操作是不可分割的,从而避免在执行过程中被中断导致竞态条件。

  3. 数据不变性: 尽量使用不可变数据结构,避免在多线程环境中直接修改共享数据。

  4. 使用并发控制工具: 如读写锁、条件变量等,可以更细粒度地控制并发访问。

二、CSP并发编程模型

1.概念

CSP(Communicating Sequential Processes)是一种并发编程模型,最初由计算机科学家Tony Hoare在1978年提出。CSP的核心思想是通过在独立执行的进程之间进行通信来实现并发。

以下是CSP模型中的基本概念:

  1. 进程(Process): CSP中的进程是并发执行的基本单元。每个进程都有自己的私有状态和执行路径。

  2. 通信(Communication): 进程通过消息传递进行通信,而不是共享内存。这意味着一个进程可以向另一个进程发送消息,从而实现信息的传递和共享。

  3. 顺序执行(Sequential Execution): 即使在并发的环境中,每个进程仍然是按照指定的顺序执行的。这有助于避免一些常见的并发问题,如竞态条件和死锁。因为没有共享内存并且各进程按顺序执行不需要同步直接消除出现竞态条件的两个必要条件。

  4. 并行性(Concurrency): 进程可以同时执行,从而提高系统的整体性能。

2. Go 语言中应用

Go语言通过goroutinechannel实现了CSP模型。在Go中,goroutine是轻量级的线程,而channel是用于在goroutine之间进行通信的数据结构。

以下是 Go 语言中CSP模型的实现:

package mainimport ("fmt""time"
)func worker(id int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Printf("Worker %d started job %d\n", id, job)time.Sleep(time.Second) // 模拟耗时的工作fmt.Printf("Worker %d finished job %d\n", id, job)results <- job * 2}
}func main() {const numJobs = 5jobs := make(chan int, numJobs)results := make(chan int, numJobs)// 启动三个goroutine,模拟三个工作线程for i := 1; i <= 3; i++ {go worker(i, jobs, results)}// 发送五个工作任务for j := 1; j <= numJobs; j++ {jobs <- j}close(jobs)// 收集工作结果for a := 1; a <= numJobs; a++ {<-results}
}

开启三个工作 worker 线程,通过从 jobs 通道中获取任务,模拟进行耗时的工作,运行完毕向 results通道中发送结果。保证了多线程同时安全执行工作。

三、Actor模型

Actor是一种并发计算模型,最初由Carl Hewitt于1973年提出。它提供了一种处理并发和分布式系统的抽象方法,通过将计算划分为独立的、自治的实体(称为Actor),这些实体通过消息传递进行通信。Actor模型的设计目标是简化并发编程,并提供一种避免共享状态和显式锁的方法。

以下是Actor模型的一些关键概念:

  1. Actor: Actor是并发计算的基本单元。每个Actor都是一个独立的计算实体,有自己的状态、行为和邮箱。Actors之间通过消息进行通信。

  2. 消息传递: 在Actor模型中,通信是通过消息传递实现的。一个Actor可以向另一个Actor发送消息,触发接收者Actor的行为。

  3. 邮箱(Mailbox): 每个Actor都有一个邮箱,用于存储接收到的消息。当一个Actor收到消息时,它会根据消息的内容执行相应的行为。

  4. 地址: 每个Actor都有一个唯一的地址,用于标识它。其他Actor可以通过这个地址向目标Actor发送消息。

  5. 并发执行: Actor模型支持并发执行,因为每个Actor都是独立的计算实体,它们可以并发地执行,并通过消息传递进行协作。

  6. 没有共享状态: Actor之间没有共享的内存状态,通信是唯一的方式来传递信息。

以下是一个简单的Actor模型的示例,使用Akka库(一个实现了Actor模型的库,用于Scala和Java):

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;// 定义一个简单的Actor
class MyActor extends UntypedActor {@Overridepublic void onReceive(Object message) {if (message instanceof String) {String msg = (String) message;System.out.println("Received message: " + msg);}}
}public class ActorExample {public static void main(String[] args) {// 创建Actor系统ActorSystem system = ActorSystem.create("MyActorSystem");// 创建一个ActorActorRef myActor = system.actorOf(Props.create(MyActor.class), "myActor");// 发送消息给ActormyActor.tell("Hello, Actor!", ActorRef.noSender());// 关闭Actor系统system.terminate();}
}

在这个例子中,定义了一个简单的Actor(MyActor),并通过Akka库创建了一个Actor系统。然后,创建了一个Actor实例,并向它发送了一条消息。Actor接收到消息后,执行了相应的行为。

四、CSP和Actor区别

  • 和Actor的直接通讯不同,CSP模式则是通过Channel进⾏通讯的,更松耦合⼀些。
  • Go中channel是有容量限制并且独⽴于处理Groutine,⽽如Erlang,Actor模式中的mailbox容量是⽆限的,接收进程也总是被动地处理消息。
  1. 通信方式:

    • CSP: CSP模型强调通过在进程之间进行同步通信来进行并发。通信是通过在通道上发送和接收消息来实现的,这些通道可以是同步或异步的。
    • Actor模型: Actor模型也使用消息传递进行通信,但它不仅仅限制于同步通信。消息是通过异步方式发送给目标Actor的,因此发送消息的Actor不需要等待接收者处理消息。
  2. 独立性:

    • CSP: CSP中的进程是相对独立的,它们通过通信进行协作,但通常是无状态的。
    • Actor模型: Actor是具有状态的实体,它们封装了自己的状态和行为。每个Actor都是自治的,有自己的私有状态,可以独立地处理消息。
  3. 并发性:

    • CSP: CSP模型通常涉及并发执行的进程,它们之间通过通信进行同步。
    • Actor模型: Actor模型也涉及并发执行,但每个Actor是一个独立的计算实体,可以并发地执行,而不需要过多的同步。
  4. 灵活性:

    • CSP: CSP更加关注同步和进程之间的协作,更适用于某些同步问题。
    • Actor模型: Actor模型更注重封装和独立性,适用于构建具有私有状态和行为的独立实体。
  5. 错误处理:

    • CSP: CSP通常使用一些错误处理机制,如超时或选择语句,来处理可能发生的并发问题。
    • Actor模型: Actor模型中通常使用监督树等机制来处理错误,一个Actor可能监督其他Actor的行为,并在需要时进行适当的处理。

总体而言,虽然CSP和Actor模型都是用于并发编程的强大工具,但它们的设计目标和重点略有不同。CSP更强调同步和通信,而Actor模型更强调独立实体和异步消息传递。选择使用哪种模型通常取决于具体的应用需求和开发者的偏好。

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

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

相关文章

【WordPress插件】热门关键词推荐v1.3.0 Pro开心版

介绍&#xff1a; WordPress插件-WBOLT热门关键词推荐插件&#xff08;Smart Keywords Tool&#xff09;是一款集即时关键词推荐、关键词选词工具及文章智能标签功能于一体的WordPress网站SEO优化插件。 智能推荐&#xff1a; 热门关键词推荐引擎-支持360搜索、Bing、谷歌&a…

【已解决】c++qt如何制作翻译供程序调用

本博文源于笔者正在编写的工具需要创建翻译文件&#xff0c;恰好将qt如何进行翻译&#xff0c;从零到结果进行读者查阅&#xff0c;并非常推荐读者进行收藏点赞&#xff0c;因为步步都很清晰&#xff0c;堪称胎教式c制作&#xff0c;而且内容还包括如何部署在windows下。堪称值…

百分点科技获国际顶会NeurIPS LLM效率挑战赛冠军

近日&#xff0c;国际人工智能顶会NeurIPS在美国新奥尔良市举办&#xff0c;在同期举行的NeurIPS 2023大语言模型效率挑战赛中&#xff0c;百分点科技以领先第二名8分的显著优势夺得NVIDIA A100赛道冠军。 NeurIPS与ICML、ICLR并称机器学习领域国际三大顶会&#xff0c;代表着人…

layui(iconPickerFa)图标选择器插件,主要用于后台菜单图标管理

话不多说直接上代码 在页面中引入如下代码 <link rel"stylesheet" href"/template/admin/layui-v2.5.6/css/layui.css"> <script type"text/javascript" src"/template/admin/layui-v2.5.6/layui.js"></script> &…

SpringCloud 整合 Canal+RabbitMQ+Redis 实现数据监听

1Canal介绍 Canal 指的是阿里巴巴开源的数据同步工具&#xff0c;用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.…

CAN协议FPGA篇

一.引言 CAN&#xff08;Controller Area Network&#xff09;总线&#xff0c;即控制器局域网总线&#xff0c;是一种功能丰富的车用总线标准。该协议最初是由德国博世&#xff08;Bosch&#xff09;公司在1983年制定的&#xff0c;之后在美国密歇根州底特律举行的汽车工程师协…

Socks5代理IP在跨境电商与游戏中的应用

随着互联网的迅猛发展&#xff0c;网络已经成为人们日常生活不可或缺的一部分。在这个数字化时代&#xff0c;跨境电商和网络游戏产业蓬勃发展&#xff0c;但伴随而来的是网络安全的威胁与挑战。本文将介绍Socks5代理IP技术&#xff0c;探讨它在网络安全、跨境电商以及游戏中的…

Hive03_数据类型

数据类型 1 案例实操 &#xff08;1&#xff09;假设某表有如下一行&#xff0c;我们用 JSON 格式来表示其数据结构。在 Hive 下访问的格式为 {"name": "wukong","friends": ["bajie" , "lili"] , //列表 Array, "c…

jupyter notebook打开其他盘的文件

jupyter notebook打开其他盘文件 打开jupyter notebook打开terminal输入&#xff1a;jupyter-notebook 路径打开你想打开的工程的文件 打开jupyter notebook 打开terminal 输入&#xff1a;jupyter-notebook 路径 打开你想打开的工程的文件

odoo17核心概念view7——listview总体框架分析

这是view系列的第七篇文章&#xff0c;今天主要介绍我们最常用的list视图。 1、先看list_view,这是主文件 /** odoo-module */import { registry } from "web/core/registry"; import { RelationalModel } from "web/model/relational_model/relational_mode…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片&#xff0c;上传失败了&#xff0c;错误信息如下 打开PicGo的日志文件查看&#xff0c;可以看到错误详情如下 换了一个插件github-plus重新配置&#xff0c;解决了这个问题 再打开日志查看&…

使用 AnyGo 修改 iPhone 手机定位

在当今数字化时代&#xff0c;我们的手机已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时我们可能会遇到一些情况&#xff0c;需要修改手机的定位信息。这个需求可能来自于各种不同的原因&#xff0c;包括但不限于保护个人隐私、测试应用程序的地理位置相关功能…

【kafka消息里会有乱序消费的情况吗?如果有,是怎么解决的?】

文章目录 什么是消息乱序消费了&#xff1f;顺序生产&#xff0c;顺序存储&#xff0c;顺序消费如何解决乱序数据库乐观锁是怎么解决这个乱序问题吗 保证消息顺序消费两种方案固定分区方案乐观锁实现方案 前几天刷着视频看见评论区有大佬问了这个问题&#xff1a;你们的kafka消…

Linux - 记录问题:怎么通过安装包的方式安装gRPC

适用场景 当docker 构建环境不能链接到github 的时候&#xff0c;就可以使用本地构建的方式 完成对应服务的构建需求。 参考案例 使用本地安装包的方式安装 gRPC 注意&#xff1a; 在Docker构建过程中&#xff0c;某些软件包可能会尝试配置时区&#xff0c;这通常需要交互式…

WordPress主题大前端DUX v8.3源码下载

DUX主题8.3版本更新内容&#xff1a; 新增&#xff1a;Cloudflare Turnstile 免费验证功能 新增&#xff1a;子菜单页面模版&#xff0c;支持多级页面 新增&#xff1a;手机端文章内表格自动出现横向滚动条&#xff0c;可集体或单独设置滚动宽度 新增&#xff1a;标签云页面模版…

【MATLAB第86期】基于matlab的Catboost多输入单输出分类预测模型 catboost-1.1.1版本

基于matlab的Catboost多输入单输出分类预测模型 catboost-1.1.1版本 运行环境 windows10 matlab2020a catboost版本&#xff1a;catboost-1.1.1 往期&#xff1a; 【MATLAB第20期】基于matlab的Catboost多输入单输出回归预测模型 catboost-1.1.1版本 一、导入数据 采用12输…

Spark与Hadoop的关系和区别

在大数据领域&#xff0c;Spark和Hadoop是两个备受欢迎的分布式数据处理框架&#xff0c;它们在处理大规模数据时都具有重要作用。本文将深入探讨Spark与Hadoop之间的关系和区别&#xff0c;以帮助大家的功能和用途。 Spark和Hadoop简介 1 Hadoop Hadoop是一个由Apache基金会…

Linux和Win 共享文件夹 搭建使用方法【超简单】+ 共享后无法出现文件夹的解决方式

win和Linux 共享文件夹 超简单的搭建使用方法 一、编辑虚拟机设置二、在Linux下访问共享文件夹三、共享后无法出现文件夹的解决方式 很多时候我们需要在Linux环境下使用一些安装包。 一般都是在win下进行下载&#xff0c;然后通过共享文件夹的方式&#xff0c;共享到虚拟机环境…

Xmake v2.8.6 发布,新的打包插件:XPack

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

手机软件APP下载类网站Pbootcms模板 游戏软件应用网站源码 模板自适应手机端

手机软件APP下载类网站pbootcms模板 游戏软件应用网站源码 模板自适应手机端 pbootcms内核开发的网站模板,该模板适用于手机APP网站、游戏软件网站等企业, 当然其他行业也可以做,只需要把文字图片换成其他行业的即可; 自适应,同一个后台,数据即时同步,简单适用!附带…