三分鐘掌握Actor和CSP模型

36e17d0c598ef1b64ceb65088db0c9e0.gif點擊上方藍字進行關注

前文傳送門:《三分鐘掌握共享內存模型和 Actor模型》, 一直想比較Actor模型與golang的CSP模型,經過一段時間的實戰記錄了本文。

Actor?vs?CSP模型

  • ??傳統多線程的的共享內存(ShareMemory)模型使用lock,condition等同步原語來強行規定進程的執行順序。

  • ??Actor模型,是基于消息傳遞的并發模型,? ?強調的是Actor這個工作實體,每個Actor自行決定消息傳遞的方向(要傳遞的ActorB),通過消息傳遞形成流水線。

502f8f98c16b58ece193ea522b23b18e.png

本文現在要記錄的是另一種基于消息傳遞的并發模型:CSP(communicating sequential process順序通信過程)。

在CSP模型,worker之間不直接彼此聯系,強調信道在消息傳遞中的作用,不謀求形成流水線。

消息的發送者和接受者通過該信道松耦合,發送者不知道自己消息被哪個接受者消費了,接受者也不知道是從哪個發送者發送的消息。

30d48333ad5e814881319363d65fa3f2.png

go的信道

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

同map,slice一樣,channel通過make內置函數初始化并返回引用,引用可認為是常量指針[2]

兩種信道:

  1. 1. 無緩沖區信道:讀寫兩端就緒后,才能通信(一方沒就緒就阻塞)

    這種方式可以用來在goroutine中進行同步,而不必顯式鎖或者條件變量。
  2. 2. 有緩沖區信道:就有可能不阻塞, 只有buffer滿了,寫入才會阻塞;只有buffer空了,讀才會阻塞。

go的信道暫時先聊到這里。

我們來用以上背景做一道 有意思的面試題吧 。

4d7425ac3b28b91ec1b6c68d2a9b0026.gif

調試多線程的都懂.gif

兩個線程輪流打印0到100?

我不會啥算法,思路比較弱智:#兩線程#, #打印奇/偶數#, 我先復刻這兩個標簽。

通過go的無緩沖信道的同步阻塞的能力對齊每一次循環。

package?mainimport?("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++?{<-ch1if?i%2?==?1?{?//?奇數fmt.Println("g1?"?+?strconv.Itoa(i))}}}()wg.Wait()
}

題解:兩個協程都執行0到100次循環,但是不管哪個線程跑的快,在每次循環輸出時均會同步對齊, 每次循環時只輸出一個奇/偶值, 這樣也不用考慮兩個協程的啟動順序。

b72352bee45c760291860bcaebaf5ac9.png

思考我的老牌勁語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個自動重置事件來切換通知,由一個線程通知另外一個線程執行。

  • (這個思路是群內各大佬討論的結果, @yi念之間? @AutoCSer,? 歡迎童鞋們提供更多方法。)

引用鏈接

[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

a179dbbefcbc67b740c7193cd0e8f445.gif

本文內容和制圖均為原創,文章永久更新地址請參閱左下角原文,如對您有所幫助,請不吝分享?。

專題相關:一網打盡

年終總結:2021技術文大盤點 ?| ?打包過去,面向未來

項目總結:麻雀雖小,五臟俱全

理念總結:實話實說:只會.NET,會讓我們一直處于鄙視鏈、食物鏈的下游

云原生系列:?什么是云原生?

d7a0a119f048fe592fd8c74df0a23d20.png

掃碼關注我們

不會讓您失望的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DateTimeToUnix/UnixToDateTime 對接時間轉換

問題&#xff0c;通過毫秒數來解析出時間&#xff1a;&#xff08;很多對接的時候經常需要用到&#xff09; <?php $MyJson {"jingdong_vas_subscribe_get_responce":{"code":"0","item_code":"FW_GOODS-2236-1","…

【學生選課系統經典】VB與SQLSERVER連接:Windows應用工程案例

實驗任務描述 1 用VB6訪問SQLSERVER數據庫(兩種安全模式); 2 用VB6完成數據庫指定表上的數據顯示; 3 用VB6完成數據庫指定表上的數據插入、刪除和更新; 4 用VB6完成SQLSERVER2008數據庫用戶驗證。 一、數據庫系統 該實驗中,所要求的數據庫名稱為SCHOOL,總共涉及以下表:

丟失api-ms-win-crt-runtime-l1-1-0.dll

運行Cmder的時候提示&#xff1a;丟失api-ms-win-crt-runtime-l1-1-0.dll在網上找了一些方法&#xff0c;基本解決方法都是裝VC2015的運行時&#xff0c;但是我安裝的時候出錯&#xff0c;大家可以先試試。接著我就去解決安裝出錯這問題沒&#xff0c;折騰了半天也沒成功。后來…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(二)魔法實習生第一步了解魔杖的使用

學習目標 了解什么是開發環境了解python語言的環境安裝了解python語言編程的編輯器工具 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的Python入門教程 》——&#xff08;一&#xff09;既然你選擇了這系列教程那么我就要讓你聽得懂 第三篇&#xff1a;《假如編…

Java之synchronized可重入性的理解

1 synchronized可重入性的理解 當一個線程試圖操作一個由其他線程持有的對象鎖的臨界資源時&#xff0c;將會處于阻塞狀態&#xff0c;但當一個線程再次請求自己持有對象鎖的臨界資源時&#xff0c;如果當前鎖是重入性&#xff0c;會請求將會成功&#xff0c;如果當前鎖不是可…

onmouseover-onmouseout

<input type"checkbox" value"autoLogin" οnmοuseοver"block()" οnmοuseοut"none()">兩周內自動登錄 <div id"div1">為了您的信息安全請不要在網吧或公共電腦勾選此項</div> <script> functi…

mysql5.7 only_full_group_by_Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報錯的解決方法

近期在開發過程中&#xff0c;因為項目開發環境連接的mysql數據庫是阿里云的數據庫&#xff0c;而阿里云的數據庫版本是5.6的。而測試環境的mysql是自己安裝的5.7。因此在開發過程中有小伙伴不注意寫了有關group by的sql語句。在開發環境中運行是正常的&#xff0c;而到了測試環…

一款高速的NET版的離線免費OCR

PaddleOCR.Onnx一款基于Paddle的OCR&#xff0c;項目使用ONNX模型&#xff0c;速度更快。本項目同時支持X64和X86的CPU上使用。本項目是一個基于PaddleOCR的C代碼修改并封裝的.NET的工具類庫。包含文本識別、文本檢測、基于文本檢測結果的統計分析的表格識別功能&#xff0c;同…

spring 注解簡單使用

一、通用注解 1、項目結構&#xff1a; 2、新建Person類&#xff0c;注解Component未指明id&#xff0c;則后期使用spring獲取實例對象時使用默認id"person"方式獲取或使用類方式獲取 package hjp.spring.annotation.commen;import org.springframework.stereotype.C…

selenium+python筆記3

#!/usr/bin/env python # -*- coding: utf-8 -*- """ desc:學習unittest的用法 注意setUp/setUpClass&#xff0c;tearDown/tearDownClass的區別 ① setUp():每個測試函數運行前運行 ② tearDown():每個測試函數運行完后執行 ③ setUpClass():必須使用classmeth…

【學生選課系統經典】C#與SQLSERVER連接:ASP.NET網站(服務器端,IIS發布)

實驗任務描述 1 用C#訪問SQLSERVER數據庫(兩種安全模式); 2 用C#完成數據庫指定表上的數據顯示; 3 用C#完成數據庫指定表上的數據插入、刪除和更新; 4 用C#完成數據庫用戶驗證。 此處使用ASP.NET工程來完成這個項目,和Windows應用不同的是:這個項目是在服務器上、依靠IIS服…

TCP包頭、UDP包頭、IP包頭、和MAC幀包頭詳細字段和包頭大小

1 TCP頭 TCP是一種可靠的、面向連接的字節流服務,頭部定義如下。 /*TCP頭定義,共20個字節*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口號16bitshort m_sDestPort;       // 目的端口號16bitunsigned int m_uiSequNum; …

經典面試題:用戶反映你開發的網站訪問很慢可能會是什么原因

原文鏈接&#xff1a;http://blog.csdn.net/lv_victor/article/details/53148421 問題場景&#xff1a;某個用戶向你反映說你開發的網站訪問速度很慢&#xff0c;但是該用戶訪問其他問題很正常&#xff0c;分析下原因、有哪些工具分析原因、怎么解決問題&#xff1f; 最近面試兩…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(三)使用初始魔法跟編程魔法世界打個招呼吧

學習目標 完成顯示魔法的使用——輸出print完成傳入魔法的使用——輸入input使魔法生效——運行python文件 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的Python入門教程 》——&#xff08;一&#xff09;既然你選擇了這系列教程那么我就要讓你聽得懂 第二篇&am…

查缺補漏系統學習 EF Core 6 (一)

推薦關注「碼俠江湖」加星標&#xff0c;時刻不忘江湖事掌握 ORM 開發方式是每一個 .NET 開發者所必備的技能&#xff0c;而且 .NET 平臺有很多優秀的 ORM 框架。很多人都會詬病 .NET 官方標配的 Entity Framework&#xff0c;感覺其笨重難用、性能低下。但其實經過多年發展&am…

mysql 5.5 mysqldump_mysql 5.5 mysqldump 原文翻譯

根據mysql 5.5第6.4章節理解和自己翻譯水平有限如有紕漏請指教,原文如下.6.4 使用mysqldump備份(Using mysqldump for Backups)首先多余的不用說了備份用來干什么大家都清楚。mysqldump備份分兩種輸出形式&#xff1a;1. 無--tab選項&#xff0c;輸出標準的SQL格式。輸出包含CR…

【經典回放】JavaScript學習詳細干貨筆記之(一)

【經典回放】JavaScript學習詳細干貨筆記之&#xff08;一&#xff09; 【經典回放】JavaScript學習詳細干貨筆記之&#xff08;二&#xff09; 【經典回放】JavaScript學習詳細干貨筆記之&#xff08;三&#xff09; 目錄 一、為什么要學JavaScript 二、JavaScript經典案例 …

Java Attach API

catalog 1. instrucment與Attach API 2. BTrace: VM Attach的兩種方式 3. Sun JVM Attach API 1. instrucment與Attach API JDK5中增加了一個包java.lang.instrucment&#xff0c;能夠對JVM底層組件進行訪問。在JDK 5中&#xff0c;Instrument 要求在運行前利用命令行參數或者系…

TCP之三次握手和四次揮手過程

1 TCP包頭里面的標志位 下圖為TCP頭部里面部分信息,入下標志位,每個標志位占一位。 標志位這里會涉及3個,ACK SYN FIN ACK:確認序號有效。 SYN:發起一個新連接。 FIN:釋放一個連接。 2 三次握手過程 第一次握手 Client將標志位SYN置1,隨機產生一個值seq=J,并將數…

Handler 機制分析

android 子線程和UI線程的交互主要使用Handler的方法進行通信。本文分析Handler機制 Handler 如何使用&#xff1f; Handler的使用比較簡單 public class MainActivity extends Activity{private Handler handler new Handler() { public void handleMessage(Message msg) { …