精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

假期7天學會Elixir,掌握函數式編程與 Actor 模型

開發 前端
Elixr/Erlang 天然支持分布式, 而作者 Joe Armstrong 在論文中是這樣認為的:幾乎所有傳統的編程語言對真正的并發都缺乏有力的支持 —— 本質上是順序化的,而語言的并發性都僅僅由底層操作系統而不是語言提供。

[[426805]]

為什么你一定需要學習 Elixir?

Elixir 是一門基于 erlang 開發的新語言,復用了 erlang 的虛擬機以及全部庫(站在已經生存了20多年巨人的肩膀上),定義了全新的語法以及構造了現代語言必不可少生態環境—包管理器,測試工具,formatter等。使用 Elixir,你可以方便的構建可用性高達99.9999以及天然分布式的程序(代碼隨手一寫就是穩定的分布式),可以秒開成千上萬 Elixir 里專屬的進程(比起系統的進程更輕量級),處理高并發請求等等。

Elixr/Erlang 天然支持分布式, 而作者 Joe Armstrong 在論文中是這樣認為的:幾乎所有傳統的編程語言對真正的并發都缺乏有力的支持 —— 本質上是順序化的,而語言的并發性都僅僅由底層操作系統而不是語言提供。而用對并發提供良好支持的語言(也就是作者說的面向并發的語言 Concurrency Oriented Language) 來邊寫程序,則是相當容易的:

  • 從真實世界的活動中識別出真正的并發活動
  • 識別出并發活動之間的所有消息通道
  • 寫下能夠在不同消息通道中流通的所有消息

Elixir 是怎么樣的語言?

Elixir 是函數式語言,與 java,C++等過程式語言不通,沒有變量?;蛘哒f,變量全都imutable(不可改變)。通過學習Elixir, 你可以學習多一種編程范式。

python 中你是這樣子處理列表的:

  1. mylist = [] 
  2. mylist.append('Google'
  3. mylist.append('Facebook'
  4. print mylist #結果是['Google''Facebook'

Elixir 中是這樣子的:

  1. myList = [] 
  2. myList = List.insert_at(myList, 0, "Google"
  3. myList = List.insert_at(myList, 1, "Facebook"
  4. IO.inspect myList 

elixir 中這不是正常的寫法,不過我只是用這些例子來介紹異同點。

注意到,在面向對象思維的語言中,處理列表,是 用對象的方法,mylist.append: 對象.動作來處理;而函數式因為變量是不可變的,是要 List.append(mylist, xx), 對象模塊.動作(哪個對象)來處理,同時會返回修改后的新對象。

數據不可變,好處就是在高并發中,并不會因為狀態多且不斷變化,引致debug 異常困難——本來人的大腦就不適應多線程。

不可變,就意味著 for 與 while循環用不了,因為不存在變量 不斷 變化,達到某值就中止循環~因此,你只能用遞歸來實現 while。

但是不怕,Elixir 提供了強大無比的抽象, each 函數,map 函數,reduce 函數,all? 函數(判斷列表所有值是否滿足此條件),group 函數(類似數據庫的 group) 等等,只有你想不到。相比之下,golang 真的是乏善可陳。

Go 語言的創始人之一,Unix 老牌黑客羅勃?派克(RobPike)的忠告:

所以說,沒有泛型就是不行的。。。

管道

是的,類似 linux 的管道 |,把處理結果傳遞給下一個函數。

  1. 1..100 
  2. |> Enum.map(fn x-> x+1 end
  3. |> Enum.filter(fn x-> rem(x, 2)==0 end
  4. |> Enum.filter(fn x-> rem(x, 3)==0 end
  5. |> Enum.filter(fn x-> rem(x, 5)==0 end
  6. |> IO.inspect 

與以下的 代碼相比,python是否相形見絀?

  1. numbers = range(1, 100) 
  2. numbers = map( (lambda x: x+1), numbers ) 
  3. numbers = filter( (lambda x: x%2 == 0), numbers ) 
  4. numbers = filter( (lambda x: x%3 == 0), numbers ) 
  5. numbers = filter( (lambda x: x%5 == 0), numbers ) 
  6. print(numbers) 

再來一個例子,來自Dave Long 的博客 Playing with Elixir Pipes[1] :

代碼的作用是:取出請求的頭部 x-twilio-signature 簽名,并且校驗是否有效。

沒有管道時,代碼是這樣子的:

  1. signature = List.first(get_req_header(conn, "x-twilio-signature"))   
  2. is_valid = Validator.validate(url_from_conn(conn), conn.params, signature)   
  3. if is_valid do   
  4.   conn 
  5. else   
  6.   halt(send_resp(conn, 401, "Not authorized")) 
  7. end 

加上管道:

  1. signature = conn   
  2.             |> get_req_header("x-twilio-signature"
  3.             |> List.first 
  4. if conn   
  5.    |> url_from_conn 
  6.    |> Validator.validate(conn.params, signature) 
  7. do   
  8.   conn 
  9. else   
  10.   conn |> send_resp(401, "Not authorized") |> halt 
  11. end 

邏輯就非常清晰了。還可以這樣子寫:

  1. signature = conn   
  2.             |> get_req_header("x-twilio-signature"
  3.             |> List.first 
  4. conn   
  5. |> url_from_conn 
  6. |> Validator.validate(conn.params, signature) 
  7. |> if(do: conn, else: conn |> send_resp(401, "Not authorized") |> halt) 

進程 Actor Model

輕量級的進程

在 Elixir 里,Elixir進程(以下簡稱進程,與系統進程區分開)是輕量級的進程,與操作系統的概念相差不多,只不過 Elixir 進程運行在虛擬機中。那為什么 Elixir 進程更快呢?

  • Erlang 進程的堆棧是動態分配、隨使用增長的,新建一個 Erlang 進程的開銷遠比系統進程 / 線程小得多,開銷就像在 OO 語言中建立一個新對象般簡單。
  • 普通進程 / 線程的內存管理是基于頁的,而頁對于一個函數 + 一點點零碎來說都太大了。而實際中 OS 分配給普通進程的初始棧可以達到 Megabytes 級別。
  • Erlang 進程之間是隔離的,沒有共享狀態,所有的消息都是異步的,不會繼承大量的已有狀態。
  • Erlang 進程的調度是在 Erlang VM 內發生的,跟 OS 層沒啥關系,無需普通進程 / 線程切換時的各種開銷
  • Erlang 進程的切換是一種類似直接 “跳轉” 的方式,以 O(1) 復雜度實現。Erlang 調度器會管理這些切換,大概只需要幾十個指令和數十納秒的時間。普通線程的切換會需要數百上前納秒,OS 調度器的運作復雜度可能是 O(logn) 或者 O(log(logn))。如果有上萬個線程,這個時間將會大幅提升。來自知乎[2]

像指揮交響樂隊一樣,指揮你的 Elixir 進程

對于Elixir 進程,你可以方便的用一個進程(supervisor)去管理子進程,supervisor會根據你設定的策略,來處理意外掛掉的子進程(這種情況不多的是,錯誤處理稍微做不好就會掛) , 策略有:

  • one_for_one:只重啟掛掉的子進程
  • one_for_all:有一個子進程掛了,重啟所有子進程
  • rest_for_one:在該掛掉的子進程 創建時間之后創建的子進程都會重啟。

老夫敲代碼就是一把梭!可不,只要重啟就行。

實質上,這是有論文支持的: 在復雜的產品系統中,幾乎所有的故障和錯誤都是暫態的,對某個操作進行重試是一種不錯地解決問題方法——Jim Gray的論文[3]中指出,使用這種方法處理暫態故障,系統的平均故障間隔時間(MTBF)提升了 4 倍。

因此,你就可以創建一課監控樹,根節點就是啥事都不做,只負責監控的進程。其他都是它的子進程,如果不是 coredump(幾乎不發生),那么根節點就不可能會掛;因此其他子進程就會正確的被處理。

當然,這有前提:5 秒內重啟超于 3 次,就會不再重啟,讓進程掛掉。為什么呢?因為重啟是為了讓進程回到當初啟動時的穩定態,既然穩定態都不穩定了,重復做重啟是沒有意義的,這時迫切需要人來處理。

方便的通信

一切皆消息。

進程間通信,就像微風一樣自然。你所監管的進程而來的信息,調用的庫的消息,全部都可以自己來 handle 并作相應處理。甚至還有抽象好的 GenServer 來讓你專門處理消息與狀態邏輯。

定時器?不需要的,我們甚至可以自己發送消息來實現更好的定時器:

Process.send_after 會在 xx 秒后發消息到指定的進程,通過這個功能,不斷往自己發消息,從而實現定時器的功能。請看實現:

  1. defmodule Periodically do 
  2.   require Logger 
  3.   use GenServer 
  4.  
  5.   def start_link do 
  6.     GenServer.start_link(__MODULE__, %{}) 
  7.   end 
  8.  
  9.   def init(state) do 
  10.     schedule_work(:do_some_work) 
  11.     {:ok, state} 
  12.   end 
  13.  
  14.   def handle_info(:do_some_work, state) do 
  15.     doing_now() 
  16.     schedule_work(:do_some_work) 
  17.     {:noreply, state} 
  18.   end 
  19.  
  20.   defp schedule_work(update_type) do 
  21.     Process.send_after(self(), update_type, 30*1000) 
  22.   end 
  23. end 

相較于 setTimeOut 之類的,好處是什么?

Elixir 自帶工具,可以查看所有進程的狀態并管理,上面把 Periodically 作為一個進程啟動起來了,自然可以管理他:P

let it crash 思想的提出與實現。

程序不可能處理一切錯誤,因此程序員只要力所能及的處理顯然易見的錯誤就好了,而那些隱藏著的,非直覺性的錯誤,就讓他崩掉吧 —— 本來就很有可能是極少見的錯誤,經常出現的?就需要程序員人工處理了,這是緊急情況,就算 try catch 所有錯誤也無法避免,因為系統已經陷入崩潰邊緣了,茍延殘喘下去只是自欺欺人。

要注意的是 let it crash ,并不是說你用 golang,C++ 等語言打包個二進制,用 supervisorctl 等工具監控,錯誤就讓他馬上崩,掛了自動重啟 - = -

模式匹配與宏

這個相較于平常我們的賦值語言比較新穎,介紹的篇幅過長。

請看http://szpzs.oschina.io/2017/01/30/elixir-getting-started-pattern-matching/ 以及https://elixir-lang.org/getting-started/pattern-matching.html

通過模式匹配,我們可以避免 if else 的嵌套地獄;可以利用語言自己的匹配來做 搜索,

宏可以讓你實現自定義的 DSL(當然太強大的功能自然導致濫用出 bug),可以屏蔽掉很多不優雅的細節。

以上就是 Elixir 的簡單介紹,建議諸位學習一下 Elixir,洗刷一下自己的 OO 以及過程式編程思維。

本文轉載自微信公眾號「山盡寫東西的cache」,可以通過以下二維碼關注。轉載本文請聯系山盡寫東西的cache公眾號。

 

責任編輯:武曉燕 來源: 山盡寫東西的cache
相關推薦

2011-08-24 09:13:40

編程

2018-11-28 11:20:53

Python函數式編程編程語言

2017-06-08 14:25:46

Kotlin函數

2015-11-02 17:25:23

Elixir編程語言未來

2022-03-26 09:06:40

ActorCSP模型

2020-07-29 08:05:42

JavaScriptTypeScript工具

2010-08-03 08:54:07

JDK 7Lambda表達式函數式編程

2022-07-07 09:03:36

Python返回函數匿名函數

2020-09-23 22:36:27

分布式架構系統

2013-09-09 09:41:34

2010-01-15 09:15:09

Scala Actor并發

2012-08-02 10:16:39

Windows Pho

2012-06-13 13:01:57

Windows Pho

2012-08-09 13:39:22

Windows Pho

2012-08-13 09:56:45

Windows Pho

2012-06-11 13:08:10

Windows Pho

2012-06-12 10:43:20

Windows Pho

2012-08-16 11:31:30

Windows Pho

2012-06-25 16:14:26

Windows Pho

2012-08-01 10:26:33

Windows Pho
點贊
收藏

51CTO技術棧公眾號

一区二区三区无码高清视频| 91福利区一区二区三区| 鬼打鬼之黄金道士1992林正英| 中文字幕影音先锋| 成人h动漫精品一区二区器材| 一区二区三区毛片| 欧美日韩一区二区三| 91精品国产乱码久久久| 秋霞成人午夜鲁丝一区二区三区| 欧美日韩一级在线| 人妻与黑人一区二区三区| 国产日韩一区| 色香阁99久久精品久久久| 成人三级做爰av| 中文字幕乱码中文乱码51精品| 欧美国产欧美综合| 成人国产1314www色视频| 国产情侣小视频| 午夜久久美女| 一区二区在线免费视频| 国产性猛交96| 亚洲精品66| 精品久久中文字幕久久av| 在线观看成人av| 免费a在线观看| 国产精品中文字幕一区二区三区| 欧美一级片免费在线| 国产一区二区三区在线视频观看| 国产成人精品三级高清久久91| 日韩一区二区高清| 狠狠躁狠狠躁视频专区| 91美女精品| 一个色在线综合| 一级特黄录像免费播放全99| 人成在线免费视频| 成人福利电影精品一区二区在线观看| 国产欧美精品一区二区三区介绍| 天堂а√在线中文在线新版| 国内精品久久久久久久影视麻豆| 日韩在线视频免费观看| 国产精品毛片一区二区| 欧美一区二区三区久久| 精品久久久久香蕉网| 日本国产一级片| 欧美影视资讯| 日韩欧美主播在线| 18禁免费观看网站| av在线资源| 亚洲一区中文日韩| 天天在线免费视频| 国产欧美久久久久久久久| 国产精品视频在线看| 日本黑人久久| 久草福利在线视频| 久久品道一品道久久精品| 国产一区二区三区四区五区加勒比| 国产精品综合在线| 黑人巨大精品欧美一区| 成人高h视频在线| 一卡二卡在线视频| 久久99久久久欧美国产| 成人欧美一区二区三区黑人孕妇| 亚洲图片视频小说| 精品一区二区三区免费播放| 国产中文字幕亚洲| 国产区精品在线| 国产美女一区二区三区| 成人激情av| 色婷婷av一区二区三区之e本道| 国产成人av一区二区| 成人综合色站| 亚洲三区在线播放| 国产欧美日韩综合精品一区二区| 日韩精品一区二区三区外面 | 成人短视频在线| 亚洲视频 欧洲视频| 欧美大片免费播放| aa级大片免费在线观看| 午夜亚洲国产au精品一区二区| 日韩av一二三四区| 欧美羞羞视频| 欧美妇女性影城| 精人妻一区二区三区| 欧美国产不卡| 在线电影av不卡网址| 波多野结衣久久久久| 欧美日韩一区二区高清| 4388成人网| 一级黄色片免费| 国产精品中文字幕日韩精品| 久久国产精品高清| av中文字幕在线| 一区二区三区中文字幕| 日韩精品―中文字幕| jizz久久久久久| 日韩欧美的一区| xxx在线播放| 7777久久香蕉成人影院| 7777kkkk成人观看| 国产又粗又大又黄| 97精品久久久午夜一区二区三区| 亚洲v国产v在线观看| 亚洲综合伊人久久大杳蕉| 精品久久香蕉国产线看观看亚洲 | 天天综合色天天综合色hd| 黄色成年人视频在线观看| 午夜欧美在线一二页| a在线观看免费视频| 巨人精品**| 久久久精品网站| 欧美性猛交bbbbb精品| 国产精一品亚洲二区在线视频| 欧美黑人xxxxx| 主播国产精品| 欧美私人免费视频| 国产又黄又粗又猛又爽的视频 | 免费看黄色a级片| free欧美| 亚洲国产精品99久久| 精品无码一区二区三区蜜臀| 国产精品久久久一区二区| 91探花福利精品国产自产在线| 男男电影完整版在线观看| 亚洲一区视频在线观看视频| 亚洲免费av一区| 欧美女王vk| 性色av香蕉一区二区| 99视频免费看| 国产精品久久二区二区| 日本xxxxxxx免费视频| 精品av导航| 久久久久999| 亚洲一级视频在线观看| 久久久久久久电影| 91国视频在线| 风间由美中文字幕在线看视频国产欧美| 丝袜美腿精品国产二区| 日韩一级片中文字幕| 91在线一区二区三区| 99在线精品免费视频| 免费观看亚洲天堂| 久久影视免费观看| 91九色蝌蚪91por成人| 亚洲国产精品成人久久综合一区| 欧美 日韩精品| 日韩美女精品| 4438全国成人免费| 欧美美女色图| 色婷婷狠狠综合| 国产男男chinese网站| 午夜综合激情| 欧美日韩免费高清| 激情开心成人网| 国产一区二区日韩| 免费黄色一级大片| 国产精品午夜免费| 在线观看免费的av| 五月天综合网站| 91精品在线观看视频| av大大超碰在线| 日韩欧美在线观看一区二区三区| 欧美成人黄色网| 成人深夜视频在线观看| 国产 日韩 欧美在线| 欧美挤奶吃奶水xxxxx| 欧美综合一区第一页| 免费一级毛片在线观看| 欧美综合在线视频| 日本激情视频一区二区三区| 国产一区二区三区免费| 国产视频在线观看网站| 欧美午夜寂寞| 国产精品观看在线亚洲人成网| 亚洲成人三级| 日韩精品一区二区三区视频在线观看 | 国产av人人夜夜澡人人爽麻豆| 成人搞黄视频| 日本91av在线播放| 3p在线观看| 日韩欧美成人午夜| 伊人手机在线视频| 中文字幕在线免费不卡| 国产精品一级无码| 久久只有精品| 公共露出暴露狂另类av| 欧美亚洲国产日韩| 成人a在线视频| av第一福利在线导航| 一色桃子一区二区| 亚洲精品成av人片天堂无码| 日韩欧美一区二区三区| 看黄色录像一级片| 成人激情视频网站| 欧美一级xxxx| 国产日韩欧美一区| 中文字幕一区二区三区在线乱码| 哺乳一区二区三区中文视频| 国产精品爽黄69天堂a| 国产丝袜在线观看视频| 亚洲色图校园春色| 精品人妻一区二区三区含羞草| 欧美日韩一区二区精品| 黄色一级大片在线免费观看| 99精品久久久久久| 亚洲成人手机在线观看| 亚洲在线网站| av片在线免费| 国产欧美日韩影院| 精品国产乱码久久久久久丨区2区| 国产一区二区三区四区五区3d | 欧美在线va视频| 欧美丰满片xxx777| 成人高清网站| 日韩精品视频在线免费观看| 国产乱码一区二区| 91搞黄在线观看| 国产a∨精品一区二区三区仙踪林| 亚洲人成电影网站色mp4| 在线小视频你懂的| av欧美精品.com| 国产精品探花在线播放| 美女一区二区久久| 免费激情视频在线观看| 在线视频精品| 男人添女人下部视频免费| 91欧美国产| 四虎一区二区| 久久成人av| 九九九九久久久久| 丁香综合av| 亚洲伊人久久综合| 亚洲色图图片| 国产精品一区二区久久国产| 成人视屏在线观看| 日韩av男人的天堂| a一区二区三区| **欧美日韩vr在线| 91福利在线免费| 高清视频欧美一级| 男人天堂亚洲天堂| 欧美丰满少妇xxxx| 福利网站在线观看| 欧美激情精品久久久久久蜜臀| a毛片在线观看| 久久久999国产| 国产在线高清视频| 久久人体大胆视频| 成人免费网站在线观看视频| 久久视频精品在线| 在线āv视频| 欧美国产在线视频| av在线最新| 3344国产精品免费看| 都市激情综合| 国产成人亚洲综合青青| 视频在线日韩| 国产精品夜间视频香蕉| 色综合视频一区二区三区日韩| 成人h猎奇视频网站| 久久爱www.| 国产精品久久久久久久天堂第1集| 视频一区日韩精品| 国产一区不卡在线观看| 色哟哟精品丝袜一区二区| 欧美日韩天天操| 欧美午夜精彩| 日本精品免费视频| 激情另类综合| 六月丁香婷婷在线| 蜜桃视频在线观看一区| 三级网站免费看| 成人丝袜高跟foot| 丰满少妇高潮一区二区| 国产精品私人自拍| 青娱乐国产在线视频| 精品国产91久久久| 最新中文字幕免费| 日韩色在线观看| 三级视频在线| 色噜噜狠狠色综合网图区| 性欧美1819sex性高清大胸| 韩国视频理论视频久久| 精品123区| 91情侣在线视频| 美女少妇全过程你懂的久久| 亚洲欧美日产图| 红桃视频欧美| 少妇性l交大片| 国产乱人伦偷精品视频免下载 | 久久艳片www.17c.com| 色呦呦视频在线观看| 日本久久91av| 清纯唯美激情亚洲| 蜜桃在线一区二区三区精品| 天天做综合网| 国产美女三级视频| 国产丶欧美丶日本不卡视频| 国产熟妇久久777777| 一区二区三区中文字幕电影| 波多野结衣人妻| 欧美成人bangbros| 在线观看完整版免费| 97久久精品国产| 自拍偷拍亚洲| 奇米影视首页 狠狠色丁香婷婷久久综合| 亚洲国产精品综合久久久| 精品99在线视频| 国产传媒一区在线| 久久婷婷五月综合| 午夜成人在线视频| 国产女人爽到高潮a毛片| 精品亚洲一区二区三区在线观看 | 国产精品无码久久av| 国产视频精品一区二区三区| 福利视频在线| 国产精品高潮呻吟久久av无限| 精品无人区一区二区| 国产又黄又爽免费视频| 日韩影院免费视频| 国产精品300页| 尤物av一区二区| 91麻豆成人精品国产免费网站| 亚洲欧美国产另类| 国产自产自拍视频在线观看| 9a蜜桃久久久久久免费| 日韩片欧美片| 色综合手机在线| 久久久久久久久久久99999| 欧美亚洲精品天堂| 亚洲成人精品视频| 91网址在线观看| 95av在线视频| 天天久久综合| 日韩av在线中文| 欧美极品美女视频| 久久久精品毛片| 亚洲深夜福利在线| 日本韩国欧美| 欧美精品中文字幕一区二区| 亚洲免费网址| 9.1成人看片免费版| 一本色道久久综合精品竹菊| 色哟哟在线观看| 全球成人中文在线| 久久成人高清| 亚洲人辣妹窥探嘘嘘| 国产精品视频一二三区| 亚洲av无码乱码国产精品fc2| 在线播放日韩精品| 美女视频一区| 日日噜噜噜夜夜爽爽| 狠狠色丁香久久婷婷综合_中 | 久草福利在线| 国产精品久久久久不卡| 日韩电影免费网址| 特黄视频免费观看| 亚洲丝袜另类动漫二区| 99久久国产热无码精品免费| 九九九热精品免费视频观看网站| 秋霞午夜一区二区三区视频| 日韩一级片免费视频| 99亚偷拍自图区亚洲| 男人天堂视频在线| 精品国产一区二区三区久久久| 国产999精品在线观看| 国产精品视频二| 99久久777色| 天天干,天天干| 久久精品视频播放| aiai久久| 日本熟妇人妻中出| 亚洲同性同志一二三专区| 亚洲AV无码一区二区三区性 | 欧美aaa视频| 艳母动漫在线观看| 成人美女视频在线观看18| 久久黄色精品视频| 日韩亚洲欧美成人| 一区二区三区自拍视频| 国产xxxxx在线观看| 国产精品久久网站| 黄色www视频| 国产精品久久久久秋霞鲁丝| 久久久久久久久久久妇女| 亚洲图片综合网| 欧洲在线/亚洲| 午夜伦理大片视频在线观看| 精品日本一区二区三区在线观看 | 肉丝美足丝袜一区二区三区四| 精品日本高清在线播放 | 欧美激情国产高清| 欧美肉体xxxx裸体137大胆| 国内精品国产三级国产aⅴ久| 福利视频第一区| 国产网站在线免费观看| 鲁丝一区二区三区免费| 国产一区二区女| wwwwww在线观看| 午夜精品久久久久久久久久久久久 | 国产精品天天干|