三分钟掌握Actor和CSP模型

  发布时间:2025-11-05 11:11:35   作者:玩站小弟   我要评论
go的CSP模型传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行规定进程的执行顺序。Actor模型,是基于消息传递的并发模型, 强调的是Actor这 。

go的分钟CSP模型

传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行规定进程的掌握执行顺序。Actor模型,分钟是掌握基于消息传递的并发模型, 强调的是Actor这个工作实体,每个Actor自行决定消息传递的分钟方向(要传递的ActorB),通过消息传递形成流水线。掌握

本文现在要记录的分钟是另一种基于消息传递的并发模型:CSP(communicating sequential process顺序通信过程)。

在CSP模型,掌握worker之间不直接彼此联系,分钟强调信道在消息传递中的掌握作用,不谋求形成流水线。分钟

消息的掌握发送者和接受者通过该信道松耦合,发送者不知道自己消息被哪个接受者消费了,分钟接受者也不知道是高防服务器掌握从哪个发送者发送的消息。

go的分钟信道

go的信道[1]是golang协程同步和通信的原生方式。

同map,slice一样,channel通过make内置函数初始化并返回引用,引用可认为是常量指针[2]。

两种信道:

1. 无缓冲区信道:读写两端就绪后,才能通信(一方没就绪就阻塞)。

这种方式可以用来在goroutine中进行同步,而不必显式锁或者条件变量。

2. 有缓冲区信道:就有可能不阻塞, 只有buffer满了,写入才会阻塞;只有buffer空了,读才会阻塞。

go的信道暂时先聊到这里。

我们来用以上背景做一道 有意思的面试题吧 。

两个线程轮流打印0到100?

我不会啥算法,思路比较弱智:#两线程#, #打印奇/偶数#, 我先复刻这两个标签。

通过go的无缓冲信道的企商汇同步阻塞的能力对齐每一次循环。

package main

import (

"fmt"

"strconv"

"sync"

)

var wg sync.WaitGroup

var ch1 = make(chan struct{})

func main() {

wg.Add(2)

go func() {

defer wg.Done()

for i := 0; i <= 100; i++ {

ch1 <- struct{}{}

if i%2 == 0 { // 偶数

fmt.Println("g0 " + strconv.Itoa(i))

}

}

}()

go func() {

defer wg.Done()

for i := 0; i <= 100; i++ {

<-ch1

if i%2 == 1 { // 奇数

fmt.Println("g1 " + strconv.Itoa(i))

}

}

}()

wg.Wait()

}

题解:两个协程都执行0到100次循环,但是不管哪个线程跑的快,在每次循环输出时均会同步对齐, 每次循环时只输出一个奇/偶值, 这样也不用考虑两个协程的启动顺序。

思考我的老牌劲语C#要完成本题要怎么做?

依旧是#两线程#、#打印奇偶数#, 我没找到C#中能多次对齐线程的能力, 于是使用两线程相互通知的方式。

volatile static int i = 0;

static AutoResetEvent are = new AutoResetEvent(true);

static AutoResetEvent are2 = new AutoResetEvent(false);

public static void Main(String[] args)

{

Thread thread1 = new Thread(() =>

{

for (var i=0;i<=100;i++)

{

are.WaitOne();

if (i % 2 == 0)

{

Console.WriteLine(i + "== 偶数");

}

are2.Set();

}

});

Thread thread2 = new Thread(() =>

{

for (var i = 0; i <= 100; i++)

{

are2.WaitOne();

if (i % 2 == 1)

{

Console.WriteLine(i + "== 奇数");

}

are.Set();

}

});

thread1.Start();

thread2.Start();

Console.ReadKey();

}

注意:

volatile:提醒编译器或运行时系统不对字段做优化(处于性能性能,编译器/runtime会对同时执行的线程访问的同一字段进行优化,加volatile忽略这种优化 )。Object-->MarshalByRefObject-->WaitHandle-->EventWaitHandle--->AutoResetEvent[3] 本次使用了2个自动重置事件来切换通知,由一个线程通知另外一个线程执行。引用链接

[1] go的信道: https://www.runoob.com/w3cnote/go-channel-intro.html

[2] 常量指针: https://zhuanlan.zhihu.com/p/133225100

[3] AutoResetEvent: https://docs.microsoft.com/en-us/dotnet/api/system.threading.autoresetevent?view=net-6.0

WordPress模板
  • Tag:

相关文章

  • 魅族耳机音质如何?一探其音乐天地(揭秘魅族耳机音质,解读音乐细腻度与震撼力)

    摘要:随着科技的不断发展,人们对音质的要求越来越高。作为一家知名的智能手机厂商,魅族推出的耳机产品备受瞩目。究竟魅族耳机的音质如何?本文将深入剖析其音乐表现力、音乐还原度以及用户评价等方...
    2025-11-05
  • 还在为 Not Defined 而苦恼吗?

    书写 JavaScript 语言时,是否经常见到这种提示报错 * is not defined?是否经常出现 undefined?这些都是因为此时变量的访问是无效或者不可用的,而限定变量的可用性的代码
    2025-11-05
  • HTML 转 Markdown 如此简单

    如何将文章将保存为 markdown ?下面推荐 2 个工具非常好用可以将直接将 HTML 转为 markdown,大家可以收藏使用https://devtool.tech/html-mdhttps:
    2025-11-05
  • MongoDB 2.5版本将提供新的查询引擎

    MongoDB2.5.0 (开发版本)中,包含了一个新的查询引擎实现。查询引擎主要的工作是通过查询条件,查询到匹配的数据。当然,这其中包括对索引的使用。现有的查询引擎在MongoDB发布的4年以来基本
    2025-11-05
  • 如何找回LD密码(有效方法帮助您恢复丢失的密码)

    摘要:在现代社会,我们几乎每天都会使用各种密码来保护我们的个人信息和账户安全。然而,有时候我们可能会忘记或丢失密码,这给我们的生活和工作带来了诸多不便。本文将介绍一些有效的方法来帮助您找...
    2025-11-05
  • MySQL在大数据、高并发场景下的SQL语句优化和最佳实践

    本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”、“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视。以下实践为个人在实际开发工作中,针对相对“大数据”
    2025-11-05

最新评论