摘要:的用例的用法最早是語言傳開來的看一下我從網上扒的代碼其中符號是往當中寫入數據的操作同時注意一般的位置對于來說是阻塞的由于能夠處理異步操作也就是說能做到異步代碼用同步寫法更多的細節搜索應該就能找到除了也實現了對于的支持也就是
CSP 的用例
CSP 的用法最早是 Go 語言傳開來的, 看一下我從網上扒的代碼:
package main import "fmt" func ping(pings chan<- string, msg string) { pings <- msg } func pong(pings <-chan string, pongs chan<- string) { msg := <-pings pongs <- msg } func main() { pings := make(chan string, 1) pongs := make(chan string, 1) ping(pings, "passed message") pong(pings, pongs) fmt.Println(<-pongs) }
其中 <- 符號是往 channel 當中寫入數據的操作.
同時注意一般 <- 的位置對于 goroutine 來說是阻塞的,
由于 channel 能夠處理異步操作, 也就是說能做到異步代碼用同步寫法.
更多的細節搜索 "go channel" 應該就能找到.
除了 Go, Clojure 也實現了對于 CSP 的支持, 也就是 core.async 這個庫,
在 Clojure 當中語法做了調整, 成了 >! 這樣的寫法, 有點怪,
但是基本功能差不多, >! 和 都是模仿的阻塞, channel 概念也一樣:
(let [c1 (chan) c2 (chan)] (go (while true (let [[v ch] (alts! [c1 c2])] (println "Read" v "from" ch)))) (go (>! c1 "hi")) (go (>! c2 "there")))
這個例子當中 (chan) 生成 channel, 然后用 go 生成 3 個線索...
雖然用了 while true, 但是通過 alts! 也形成了阻塞.
更新細節搜索 "core.async" 可以找到.
看 Wiki https://en.wikipedia.org/wiki...
In computer science, communicating sequential processes (CSP) is a formal language for describing patterns of interaction in concurrent systems.[1] It is a member of the family of mathematical theories of concurrency known as process algebras, or process calculi, based on message passing via channels. CSP was highly influential in the design of the occam programming language,1 and also influenced the design of programming languages such as Limbo[3] and Go.[4]
CSP 本來是用于描述并發的系統之間如何交互的, 也就是在 Go 當中的用法.
由于并發的操作通常都是異步的, 所以 CSP 也能適合異步的行為.
最主要的概念就是 Channel, 也叫做"管道", Channel 可以用于傳輸數據,
因而就有對于管道讀和寫的操作, 分別是 take! 和 put!, Clojure 里的叫法.
前面說了, 管道看上去是阻塞代碼執行的, 也就是說讀和寫可以進行等待.
這樣就能模擬一些場景, 比如抓取網絡數據再打印, 就很容易寫出來了.
常見功能還有 alts!, 對應 Go 的 select, 就是多個 Channel 取首先返回的數據,
還有 merge 記不大清, 好像是匯總多個 Channel 返回的數據, 變成一個?
其他的 filter, map 等等序列的操作, 在 Channel 上也有類似實行,
另一方面 CSP 在實用當中應該是進行了擴展, 實際功能不止這些.
比如說增加了 (timeout 1000) 這樣的 Channel 等待一秒返回數據,
還有對 Channel 進行 Buffer 的功能, 以及異步的推數據等等.
聽起來很花哨, 但是如果有動畫可以展示一下就很清楚了, 我還沒找到...
從整體的思路上說, 這是對于異步事件的一種抽象, 可以用來實現很多業務.
想想辦法再解釋細節吧, 我這里先介紹 JavaScript 這邊的情況...
由于 Node 6 開始有 yield, 用同步代碼寫異步成為了可能,
于是有就有了 js-csp 這個模塊, 通過 yield 實現了 CSP 的功能,
我還看到一個用了 async 的, 估計不能用, 但是供參考:
https://github.com/ubolonton/...
https://github.com/dvlsg/asyn...
我直接貼一遍 README 當中的例子, 自己看看能不能看懂:
function* player(name, table) { while (true) { var ball = yield csp.take(table); // 等待取得數據 if (ball === csp.CLOSED) { // 關閉狀態特殊處理 console.log(name + ": table"s gone"); return; } ball.hits += 1; console.log(name + " " + ball.hits); yield csp.timeout(100); // 等待延時結束 yield csp.put(table, ball); // 推數據并等待對方取 } } csp.go(function* () { var table = csp.chan(); // 創建 Channel csp.go(player, ["ping", table]); // 相當于啟動 goroutine csp.go(player, ["pong", table]); // 相當于啟動 goroutine yield csp.put(table, {hits: 0}); // 推數據等待對方取 yield csp.timeout(1000); // 等待延時結束 table.close(); });
運行的效果是:
=>> node go.js ping 1 pong 2 ping 3 pong 4 ping 5 pong 6 ping 7 pong 8 ping 9 pong 10 ping: table"s gone pong: table"s gone
這樣模擬的就是兩個進程之間相互發送數據的場景.
但實際上 CSP 可以對事件流進行抽象, 也就能做出更強大的功能.
這就是在我之前推薦的這篇文章上的做的介紹, 點進去看吧:
http://jlongster.com/Taming-t...
隨著瀏覽器和 Node 對 yield 支持的完善, 使用 js-csp 已經可以做到.
考慮到方案的靈活性, 我認為值得往深了去挖一挖.
事件流的另一套有名的方案就是 Rx, 有 js 版本的 Rxjs.
大概來說, Rx 是用 OOP 語法封裝的 FP 風格的響應式編程方案, 操作繁多,
而 CSP 通過管道提供的是一些靈活但過于基礎的原語,
看社區的討論, 其實有很大的重疊的部分, 盡管細節還很難說...
我搜集了一些文章:
https://medium.com/@puppybits...
還有 GitHub 上的一些討論:
https://github.com/ubolonton/...
https://github.com/cyclejs/cy...
另外還有某人用 Rx 寫法模仿 CSP 方案的博客:
http://swannodette.github.io/...
http://swannodette.github.io/...
http://potetm.github.io/2014/...
http://potetm.github.io/2014/...
說起來我還沒怎么消化這東西.. 但是如果看過文章里的 Demo, 你一定印象深刻,
流是數據和時間綁定在一起形成的產物, 普通的編程手法很難處理,
但是 CSP 的概念讓處理 Channel 中傳遞的數據成為了而比較靈活的事情.
參考國外社區的評論, 這是具備相當大價值的一塊知識, 所以在持續跟進.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90935.html
摘要:發現一個月沒刷技術文章了有點慌整理一篇短的用法出來只包含最基本的用法在里邊最清晰不過我是在寫的版本的實現包含異步用法會更繁瑣一些但是也值得看看我相信普及之前還是一個很有意思的選擇我的代碼寫的是可以自動腦補圓括號花括號上去注意包含的函數自動 發現一個月沒刷技術文章了, 有點慌, 整理一篇短的 CSP 用法出來,只包含最基本的用法, 在 Go 里邊最清晰, 不過我是在 Clojure 寫的...
摘要:原文的個示例是什么一般來說它是寫并行代碼的一套方案在語言里自帶該功能通過基于的來實現現在通過也能做支持了或者說的功能為什么我要關心因為它強大啊而且高效而且簡單都這樣了你還想要什么好吧說細節怎樣使用呢我們用而且需要支持才有也就說或者更高的版 原文 http://lucasmreis.github.io/b... Communicating Sequential Processes 的 7...
摘要:前言今天群里面有很多都在問關于組件之間是如何通信的問題,之前自己寫的時候也遇到過這類問題。英文能力有限,如果有不對的地方請跟我留言,一定修改原著序處理組件之間的交流方式,主要取決于組件之間的關系,然而這些關系的約定人就是你。 前言 今天群里面有很多都在問關于 React 組件之間是如何通信的問題,之前自己寫的時候也遇到過這類問題。下面是我看到的一篇不錯英文版的翻譯,看過我博客的人都知道...
摘要:關鍵字表示代碼在該處將會被阻塞式暫停阻塞的僅僅是函數代碼本身,而不是整個程序,但是這并沒有引起函數內部自頂向下代碼的絲毫改變。通過實現模式在通過實現理論的過程中已經有一些有趣的探索了。 至此本系列的四篇文章翻譯完結,查看完整系列請移步blogs 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,望不吝指正issue ES6 Generators: 完整系列 The Basics...
閱讀 3921·2021-11-17 09:33
閱讀 3283·2021-10-08 10:05
閱讀 3111·2021-09-22 15:36
閱讀 1140·2021-09-06 15:02
閱讀 2772·2019-08-29 12:45
閱讀 1590·2019-08-26 13:40
閱讀 3399·2019-08-26 13:37
閱讀 420·2019-08-26 13:37