Erlang 簡要

世界是并行的,Erlang程序反應(yīng)了我們思考和交流的方式,人作為個(gè)體通過發(fā)送消息進(jìn)行交流智玻,如果有人死亡,其他人會注意到芙代。
Erlang里的模塊類相當(dāng)于OOPL中的類吊奢,進(jìn)程相當(dāng)于OOPL里的對象或類實(shí)例。
并發(fā)編程可以用來提升性能纹烹,創(chuàng)建可擴(kuò)展和容錯(cuò)的系統(tǒng)页滚,以及編寫清晰和可理解的程序來控制現(xiàn)實(shí)世界里的應(yīng)用。

并發(fā)程序是以一種并發(fā)編程語言編寫的程序铺呵,并發(fā)編程語言擁有用于編寫并發(fā)程序的語言結(jié)構(gòu)裹驰。Erlang的并發(fā)程序是由互相通信的多組順序進(jìn)程組成,一個(gè)進(jìn)程就是一個(gè)輕量級的虛擬機(jī)片挂,可以執(zhí)行單個(gè)的Erlang函數(shù)幻林,只能通過發(fā)送和接收消息來與其他進(jìn)程通信。也就是說音念,并發(fā)性是由Erlang虛擬機(jī)提供的沪饺,并操作系統(tǒng)的并發(fā)控制粒度要小很多。
在Erlang里:

  1. 創(chuàng)建和銷毀進(jìn)程是非趁品撸快的
  2. 在進(jìn)程間發(fā)送消息是非痴希快的
  3. 進(jìn)程在所有操作系統(tǒng)上都具有相同的行為方式
  4. 可以擁有大量的進(jìn)程
  5. 進(jìn)程間不共享內(nèi)存,是完全獨(dú)立
  6. 唯一的溝通方式是消息傳遞,每個(gè)進(jìn)程都有一個(gè)郵箱與進(jìn)程同步創(chuàng)建讥脐。

動態(tài)代碼載入是Erlang特性之一遭居,函數(shù)調(diào)用的總是最新模塊里的最新版函數(shù)啼器,哪怕當(dāng)代碼在模塊里運(yùn)行時(shí)重新編譯了該模塊也是如此。

基本元素操作

Erlang shell中俱萍,用句號加空格镀首、tab或回車來結(jié)束表達(dá)式,%表示注釋的起點(diǎn),;隔離子句鼠次。模塊是.erl 文件更哄,庫的頭文件.hrl, shell中的編譯時(shí)c(),外編譯命令時(shí)erlc, 退出shell用q(),或erlang:halt().

變量以大寫字母開頭腥寇,且不能重新綁定變量成翩,只能一次性賦值,具有不可變狀態(tài)赦役。原子是全局的麻敌,不需要宏定義或包含文件,以小寫字母開頭掂摔,還可放在單引號內(nèi)术羔,是極簡表達(dá)式。

元組(tuple)是一些數(shù)量固定的項(xiàng)目歸組成單一實(shí)體{,}, 由于是匿名的乙漓,通常在第一個(gè)元素上貼標(biāo)簽级历,來增加可讀性。提取元組中的值使用模式匹配操作符=叭披,為匿名變量寥殖,多個(gè)不必綁定相同的值。但是涩蜘,_Mode則是常規(guī)變量嚼贡。例如:

2> Family={family,father,mother,son}.
{family,father,mother,son}
3> {_,X,Y,Z}=Family.
{family,father,mother,son}
4> X.
father
5> Y.
mother
6> Z.
Son

記錄(record)是元組的另一種形式,可以給元組的各個(gè)元素關(guān)聯(lián)一個(gè)名稱同诫。使用記錄的情形:
1) 用一些預(yù)先確定且數(shù)量固定的原子表示數(shù)據(jù)
2) 元素?cái)?shù)量和元素名稱不會隨時(shí)間改變
3) 大元組中每個(gè)元組有相同的結(jié)構(gòu)
采用#myrecord{k1=v1,k2=v2..}來創(chuàng)建record粤策。

列表(list)形如[,误窖,]可以存放任意數(shù)量的事物叮盘。Head可以是任何事物,Tail通常仍然是個(gè)列表贩猎。只要用[…|T]構(gòu)建一個(gè)列表熊户,就應(yīng)確保T是一個(gè)列表萍膛。同樣使用模式匹配來提取列表中的元素吭服。列表推導(dǎo)的常規(guī)形式:

[X||Qualifier1,Qualifier2,…]

X是任意一表達(dá)式,限定符qualifier可以生成器蝗罗,位串生成器或過濾器艇棕。生成器的寫法

Pattern<- ListExpr

反轉(zhuǎn)一個(gè)列表時(shí)蝌戒,要調(diào)用lists:reverse.

Erlang中沒有字符串,字符串是個(gè)整數(shù)列表沼琉,”HelloCloud”是一個(gè)列表的簡寫北苟,io:format來指定打印輸出。

映射組(map)是鍵值對的關(guān)聯(lián)性集合打瘪,內(nèi)部作為有序計(jì)劃存儲友鼻,適用情形:
1) 鍵不能預(yù)知時(shí)來表示鍵值對數(shù)據(jù)結(jié)構(gòu)
2) 存在大量不同鍵來表示數(shù)據(jù)
3) 效率不重要時(shí)的萬能數(shù)據(jù)結(jié)構(gòu)
4) 自解釋型數(shù)據(jù)結(jié)構(gòu)
5) 用來表示鍵值解析樹,如xml或配置文件
6) 用Json來通信

映射組的語法:

#{key1 op val1,key2 op val2,…,KeyN op valN}

'#后沒有名稱闺骚,op是=>或:=之一彩扔。 => 將現(xiàn)有鍵值更新為新值或給映射組增加一個(gè)新鍵值對。 :=用于更新僻爽。 健不能包含任何變量虫碉,值可以包含未綁定變量,在模式匹配成功后綁定胸梆。

映射組可以通過io:format 里的~p選項(xiàng)輸出敦捧,并用io:read 或file:consult讀取。
Maps:to_json(Map)->Bin 轉(zhuǎn)化為二進(jìn)制型json
Maps:from_json(bin)-> Nap, 將二進(jìn)制json轉(zhuǎn)化為map

Json與映射組的對應(yīng)關(guān)系:
1) Json數(shù)字:Erlang的整數(shù)或浮點(diǎn)數(shù)
2) Json字符串:Erlang二進(jìn)制型
3) Json列表:Erlang列表
4) true和false 對應(yīng)
5) 映射組中的健必須是原子碰镜,字符串或二進(jìn)制型兢卵,值必須用JSON的數(shù)據(jù)類型表示

模塊與模式匹配

模塊是Erlang的基本代碼單元,erl文件編譯后以.beam作為擴(kuò)展名绪颖,采用UTF8字符集济蝉,.erl文件示意如下:

-module(模塊名,與存放模塊的文件名相同)
-export([方法名/輸入?yún)?shù)的個(gè)數(shù)])
Method1( {a,b,c})->a*b*c;
Mehtod2({d,e})->d-e.  

模塊屬性有兩種類型:預(yù)定義型和用戶定義型菠发。

Erlang中用于代表函數(shù)的數(shù)據(jù)類型被稱為fun,相當(dāng)于Python中的lambda王滤,一般用于

  1.  對列表里的每個(gè)元素執(zhí)行相同的操作
    
  2.  創(chuàng)建自己的控制
    
  3.  實(shí)現(xiàn)可重入解析代碼,解析組合器或者lazy evaluator
    

模式匹配是Erlang的根基滓鸠,case和if表達(dá)式使Erlang小而一致雁乡。

case Expression  of
         Pattern1[ when Guard1] -> Expr-seq1;
         Pattern2[when Guard2]-> Expr-seq2;
         …
end
if
         Guard1-> Expr_seq1;
         Guard2-> Expr_seq2;
         …
end

Erlang有兩種方法來捕捉異常錯(cuò)誤,一種是把拋出異常的調(diào)用函數(shù)封裝在一個(gè)try_catch 表達(dá)式里糜俗,提供了概括信息踱稍,另一種是把調(diào)用封裝在一個(gè)catch表達(dá)式里,提供了詳細(xì)的棧跟蹤信息悠抹。在捕捉到一個(gè)異常后珠月,可以調(diào)erlang:get_stacktrace()來找到最近的棧信息。

把二進(jìn)制型楔敌,位串啤挎,和位級模式匹配引入Erlang是為了簡化網(wǎng)絡(luò)編程。二進(jìn)制型是置于雙小于號和雙大于號之間的一列整數(shù)或字符串卵凑。
例如: 1> Mybin1 = << “I LOVE YOU”>>

Term_to_bingary(Term) ->Bin 轉(zhuǎn)換為二進(jìn)制型
Binary_to_Term(Bin) ->Term 二進(jìn)制型轉(zhuǎn)換為Erlang的數(shù)據(jù)類型
精心選擇宏的名稱和Erlang代碼布局庆聘,能最大限度地縮小C和Erlang的語義鴻溝胜臊。在Erlang里,最小的尋址單元是1位伙判,位串里的位序列可直接訪問象对。

運(yùn)行

運(yùn)行Erlang程序的方式:

  1.  在Erlang shell 中編譯執(zhí)行
    
  2.  Shell 腳本執(zhí)行,例
    
Hello.sh
#!/bin/sh
Erl –noshell –pa /home/abel/practice/erlang/code –s hllstart –s init stop  
  1.  作為Escript 運(yùn)行宴抚,例  
    
#!/usr/bin/env escript
Main(args)->
Io:format(“Hello world ~n”)

內(nèi)置函數(shù)apply能調(diào)用某個(gè)模塊的某個(gè)函數(shù)并傳參勒魔。每個(gè)erlang進(jìn)程都有一個(gè)被稱為進(jìn)程字典的私有數(shù)據(jù)存儲區(qū)。為了增強(qiáng)類型的表達(dá)能力菇曲,可以用描述性變量給它們加上注解沥邻,類型規(guī)范為spec,類型說明type羊娃。通過dialyzer可以檢查程序中的類型錯(cuò)誤唐全,最好寫模塊時(shí)先考慮類型并聲明它們,然后編寫代碼蕊玷。兩個(gè)載入路徑的函數(shù):
-spec code:add_patha(Dir)=>true|{error:bad_directory} 載入路徑頭加入
-spec code:add_pathz(Dir)=>true|{error:bad_directory} 載入路徑尾加入
通過os:cmd(command)可以在erlang中調(diào)用shell的腳本,查找標(biāo)準(zhǔn)庫源碼的命令code:which(file).

Make 是erlang的任務(wù)自動化工具邮利,可以通過它來運(yùn)行程序。下面是一個(gè)簡單的makefile:

.SUFFIXES: .erl .beam
.erl .beam:
        erlc  -W $<
ERL = erl –boot start_clean
MODS = module1 module2 module3
all: compile
        $(ERL)  –pa    ‘home/abel/…/dir’–s module1 start
 
compile: ${MODS:%=%.beam}
 
clean:
        rm  -rf *.beam erl_crash.dump
 

如果Erlang程序崩潰了垃帅,會留下一個(gè)erl_crash.dump文件延届,可以通過web故障分析器來分析,命令如下:

1>    crashdump_viewer:start().

并發(fā)

Erlang中基本的并發(fā)函數(shù)
1) Pid =spwan(Mod,Func,Args) 創(chuàng)建一個(gè)新的進(jìn)程來執(zhí)行apply(Mod,Func,Args),與調(diào)用進(jìn)程并列運(yùn)行贸诚,會使用最新的代碼定義模塊方庭。
2) Pid!Message 向Pid進(jìn)程異步發(fā)送Message酱固,械念!為發(fā)送操作符
3) Receive … end 接收消息

    receive
           Pattern1[when Guard1]-> Expression1;
           Pattern2[whenGuard2]->Expression2;
…
         aftertime->
                   Expressions
         end.

內(nèi)置函數(shù)erlang:system_info(process_limit)可找出所允許的最大進(jìn)程數(shù),默認(rèn)為262144.
進(jìn)程注冊的內(nèi)置函數(shù)有:
register(AnAtom运悲,Pid)用名稱注冊Pid
uregister(AnAtom) 注銷關(guān)聯(lián)注冊
whereis(AnAtom)->Pid|undefined 檢查Pid是否注冊
registered()->[AnAtom::atom()]返回系統(tǒng)里所有注冊進(jìn)程的列表龄减。

并發(fā)程序模板:

-module(ctemplate).
-compile(export_all).
 
start() ->
         Spwan(?MODULE,loop,[]).
 
rpc(Pid,Request) ->
         Pid! {self(),Request},
         receive
                   {Pid,Respone}->
                            Response
         end.
 
loop(X) ->
         receive
                   Any->
                            Io:format(“Received:~p ~n”, [Any]),
                            loop(X)
         end.

每當(dāng)收到消息時(shí)會處理它并再次調(diào)用loop(),這一過程稱為尾遞歸,無需消耗堆棸嗝校空間可以一直循環(huán)下去希停。

Erlang并發(fā)程序的錯(cuò)誤處理建立在遠(yuǎn)程監(jiān)測和處理錯(cuò)誤的基礎(chǔ)上,重點(diǎn)在補(bǔ)救而不是預(yù)防署隘,幾乎沒有防御性代碼宠能,只有在錯(cuò)誤后清理系統(tǒng)的代碼,即讓其他進(jìn)程修復(fù)錯(cuò)誤和任其崩潰磁餐。

程序在出錯(cuò)時(shí)立即崩潰的優(yōu)點(diǎn):
1) 不編寫防御性代碼违崇,直接崩潰簡單
2) 別人來修復(fù)
3) 不會使錯(cuò)誤惡化
4) 第一時(shí)間舉旗示意
5) 修復(fù)時(shí)不擔(dān)心原因重在清理
6) 簡化了系統(tǒng)架構(gòu)
監(jiān)視和連接類似,但監(jiān)視是單向的,如果被監(jiān)視的進(jìn)程掛了會向監(jiān)視進(jìn)程發(fā)一“宕機(jī)“消息亦歉,而不是退出信號〕┭疲基本錯(cuò)誤處理函數(shù)有:

-spec spwan_link(Fun) ->Pid
-spec spwan_monitor(Fun)-> {Pid,Ref}
-spec process_flag(trap_exit,true)
-spec link(Pid) ->true
-spec unlink(Pid) -> true
-spec erlang:monitor(process,Item) ->Ref
-spec exit(Why) -> none()

分布式模型:分布式erlang 和基于socket的分布式模型肴楷。分布式erlang運(yùn)行在可信網(wǎng)絡(luò),通常在同一局域網(wǎng)的集群上荠呐,并受防火墻保護(hù)赛蔫。基于socket的分布式模型基于TCP/IP不可信網(wǎng)絡(luò).
分布式Erlang的主要問題在于客戶端可以自行決定在服務(wù)器上分裂出多種進(jìn)程泥张,適合于你擁有全部的機(jī)器呵恢,并且想在單臺機(jī)器上控制他們。lib_chan 模塊讓用戶能夠顯式控制自己的機(jī)器分裂出哪些進(jìn)程媚创。

為了在互聯(lián)網(wǎng)上執(zhí)行并發(fā)程序:
1) 確保4369端口對TCP和UDP都開發(fā)渗钉,該端口保留給epmd(Erlang端口映射守護(hù)進(jìn)程)
2) 選擇1個(gè)或一段連續(xù)的端口給分布式erlang使用,確保這些端口開放钞钙,例如:

$erl -name …-setcookie … -kernelinet_dist_listen_min Min
Inet_dist_listen_maxMax

Rpc提供了許多遠(yuǎn)程調(diào)用服務(wù)鳄橘,global里的函數(shù)可以用來在分布式系統(tǒng)里注冊名稱以及維護(hù)一個(gè)全連接的網(wǎng)絡(luò)。
Erlang集群就是一組帶有相同cookie的互連節(jié)點(diǎn)芒炼。創(chuàng)建cookie的三種方法:
1) 在文件$HOME/.erlang.cookie存放相同的cookie
2) 在Erlang啟動時(shí)瘫怜,可以用 –setcookie,例如

$erl  -setcookieABCDEFG2048

3) 內(nèi)置函數(shù)erlang:set_cookie(node(),C)在程序中指定

Erlang通過名為端口的對象與外部程序通信本刽,如果想端口發(fā)送一個(gè)消息鲸湃,這一消息就會被發(fā)往與端口相連的外部程序,來自外部程序的消息會變成來自端口的Erlang消息子寓。創(chuàng)建端口的進(jìn)程成為端口的相連進(jìn)程暗挑,所有發(fā)往端口的消息都必須標(biāo)明相連進(jìn)程的PID,所有來自外部程序的消息都會發(fā)往相連進(jìn)程斜友。

socket 編程簡例

Erlang 中g(shù)en_tcp 用于編寫TCP程序窿祥,gen_udp用于編寫UDP程序。一個(gè)簡單的TCP服務(wù)器echo示例:

Start_echo_server()->
         {ok,Listen}= gen_tcp:listen(1234,[binary,{packet,4},{reuseaddr,true},{active,true}]),
         {ok,socket}=get_tcp:accept(Listen),
         gen_tcp:close(Listen),
         loop(Socket).
 
loop(Socket) ->
         receive
                  {tcp,Socket,Bin} ->
                            io:format(“serverreceived binary = ~p~n”,[Bin])
                            Str= binary_to_term(Bin),
                            io:format(“server  (unpacked) ~p~n”,[Str]),
                            Reply= lib_misc:string2value(Str),
                            io:format(“serverreplying = ~p~n”,[Reply]),
                            gen_tcp:send(Socket,term_to_binary(Reply)),
                            loop(Socket);
                   {tcp_closed,Socket} ->
                            Io:format(“ServerSocket closed ~n”)
         end.

Tcp 的echo客戶端示例:

echo_client_eval(Str) ->
         {Ok,Socket} = gen_tcp:connect(“l(fā)ocalhost”,2345,[binary,{packet,4}]),
         ok= gen_tcp:send(Socket, term_to_binary(Str)),
         receive
                   {tcp,Socket,Bin}->
                            Io:format(“Clientreceived binary  = ~p~n”,[Bin]),
                            Val=binary_to_term(Bin),
                            io:format(“Clientresult = ~p~n”,[Val]),
                            gen_tcp:close(Socket)
         end.

UDP server示例

udp_demo_server(Port) ->
         {ok,Socket}= gen_udp:open(Open,[Binary]),
         loop(Socket).
Loop(Socket)->
         receive
                   {udp,Socket,Host,Port,Bin}->
                            BinReply= …,
                            gen_udp:send(Socket,Host,Port,BinReply),
                            loop(Socket)
         End.

UDP client 示例:

udp_demo_client(Request) ->
         {ok,Socket}= gen_udp:open(0,[Binary]),
         ok= gen_udp:send(Socket,”localhost”,1234,Request),
         Value=    receive
                                     {udp,Socket,_,_,Bin}-> {ok,Bin}
                            after2000 -> error
                            end,
         gen_udp:close(Socket),
         Value

注意蝙寨,因?yàn)閁DP是不可靠的晒衩,一定要設(shè)一個(gè)超時(shí)時(shí)間,而且Reqeust最好小于500字節(jié)墙歪。
WebSocket听系, JS 和Erlang相結(jié)合,能夠?qū)崿F(xiàn)Web的絕大多數(shù)功能虹菲。

OTP

OTP包含了一組庫和實(shí)現(xiàn)方式靠胜,可以構(gòu)建大規(guī)模、容錯(cuò)和分布式的應(yīng)用程序必逆,包含了許多強(qiáng)大的工具畜普,能夠?qū)崿F(xiàn)H248桐愉,SNMP等多種協(xié)議窒升,核心概念是OTP行為掏秩,可以看作一個(gè)用回調(diào)函數(shù)作為參數(shù)的應(yīng)用程序框架亚亲,類似一個(gè)J2EE容器廓译。行為負(fù)責(zé)解決問題的非函數(shù)部分侮穿,回調(diào)函數(shù)負(fù)責(zé)解決函數(shù)部分响谓。

通過gen_server模塊可以實(shí)現(xiàn)事物語義和熱代碼交換损合,

  1.  確定回調(diào)模塊名
    
  2.  編寫接口函數(shù)
    
  3.  在回調(diào)模塊里編寫6個(gè)必需的回調(diào)函數(shù)
    

當(dāng)服務(wù)器崩潰時(shí),需要一種機(jī)制來檢測并重啟它娘纷,要用到監(jiān)測樹嫁审,即創(chuàng)建一個(gè)監(jiān)控器來管理服務(wù)器。監(jiān)測樹有兩種:一對一和一對多赖晶。
$erl –boot start_sasl
會創(chuàng)建一個(gè)運(yùn)行生產(chǎn)系統(tǒng)的環(huán)境律适,系統(tǒng)架構(gòu)支持庫(SASL,System Administration Support Libriaries)將負(fù)責(zé)錯(cuò)誤記錄和過載保護(hù)等工作遏插。

使用gen_server擦耀, gen_supervisor,application等行為涩堤,可以構(gòu)建可靠性為99.9999999的系統(tǒng)眷蜓。
統(tǒng)一化的erlang消息:
1) 抽象了不同線路協(xié)議之間的區(qū)別
2) Erlang消息無需解析,接收進(jìn)程不必先解析消息再處理胎围,而http服務(wù)器就必須解析就收到的所有消息
3) Erlang消息可以包含任意復(fù)雜度的數(shù)據(jù)類型吁系,而http消息必須被序列化成扁平化才能傳輸
4) Erlang消息可以在不同處理器之間傳送
常見的第三方庫有rebar(https://github.com/basho/rebar)和cowboy(https://githun.com/extend/cowboy)。 Rebar是管理erlang項(xiàng)目的事實(shí)標(biāo)準(zhǔn)白魂,用戶可以通過rebar創(chuàng)建新項(xiàng)目汽纤、編譯項(xiàng)目、打包它們福荸,以及把它們與其他項(xiàng)目整合在一起蕴坪,同時(shí)集成了github。Cowboy是一個(gè)用erlang編寫的高性能web服務(wù)器敬锐,是嵌入式web的熱門實(shí)現(xiàn)背传。另外,庫mochiweb2(http://github.com/mochi/mochiweb)的編碼和解碼方法可以實(shí)現(xiàn)json字符串和erlang數(shù)據(jù)類型的相互轉(zhuǎn)換台夺。

Erlang程序在多核CPU上運(yùn)行
1) 使用大量進(jìn)程
2) 避免副作用径玖,例如不使用共享式ETS或DETS
3) 避免順序瓶頸,可以選擇pmap代替map
4) 小消息颤介,大計(jì)算
5) 用mapreduce使計(jì)算并行化
mapreaduce是一個(gè)并行高階函數(shù)梳星,定義如下

  -specmapreduce(F1,F2,Acc0,L) ->Acc
         F1 = fun(Pid,X) ->void
         F2 = fun(Key,[Value],Acc0) ->Acc
         L = [X]
         Acc = X =term()  
       

Mapreduce 是在并行高階函數(shù)(phofs)模塊中定義的赞赖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冤灾,隨后出現(xiàn)的幾起案子前域,更是在濱河造成了極大的恐慌,老刑警劉巖韵吨,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿垄,死亡現(xiàn)場離奇詭異,居然都是意外死亡学赛,警方通過查閱死者的電腦和手機(jī)年堆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門吞杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盏浇,“玉大人,你說我怎么就攤上這事芽狗【铌” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵童擎,是天一觀的道長滴劲。 經(jīng)常有香客問我,道長顾复,這世上最難降的妖魔是什么班挖? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮芯砸,結(jié)果婚禮上萧芙,老公的妹妹穿的比我還像新娘。我一直安慰自己假丧,他們只是感情好双揪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著包帚,像睡著了一般渔期。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渴邦,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天疯趟,我揣著相機(jī)與錄音,去河邊找鬼谋梭。 笑死迅办,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的章蚣。 我是一名探鬼主播站欺,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼姨夹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矾策?” 一聲冷哼從身側(cè)響起磷账,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贾虽,沒想到半個(gè)月后逃糟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓬豁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年绰咽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地粪。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡取募,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟆技,到底是詐尸還是另有隱情玩敏,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布质礼,位于F島的核電站旺聚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眶蕉。R本人自食惡果不足惜砰粹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望造挽。 院中可真熱鬧碱璃,春花似錦、人聲如沸刽宪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圣拄。三九已至嘴秸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庇谆,已是汗流浹背岳掐。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭耳,地道東北人串述。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像寞肖,于是被迫代替她去往敵國和親纲酗。 傳聞我的和親對象是個(gè)殘疾皇子衰腌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)觅赊,斷路器右蕊,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 在服務(wù)器端程序開發(fā)領(lǐng)域,性能問題一直是備受關(guān)注的重點(diǎn)吮螺。業(yè)界有大量的框架饶囚、組件、類庫都是以性能為賣點(diǎn)而廣為人知鸠补。然而...
    零一間閱讀 874評論 0 12
  • 葉冉在后來的幾日里追著我打聽萝风,相親到底發(fā)生了什么。因?yàn)樵谶@之前我頗雄心壯志的同她講紫岩,新時(shí)代的女性要自立自由规惰,我必定...
    毛彩虹閱讀 380評論 1 5
  • 尚在車上時(shí),我就已經(jīng)受感於街景之肅穆被因。雖仍同前一日一般天暗著卿拴,又有閃爍的燈光縈繞衫仑,卻透著長長的肅靜梨与,於此一條街上,...
    瓶蓋閱讀 367評論 0 2
  • 每一句話都很舒服文狱。
    蘇醒love閱讀 160評論 0 0