小豬的Python學(xué)習(xí)之旅 —— 6.捋一捋Python線程概念

引言

從剛開(kāi)始學(xué)習(xí)Python爬蟲(chóng)的時(shí)候,就一直惦記著多線程這個(gè)東西,
想想每次下載圖片都是單線程郁稍,一個(gè)下完繼續(xù)下一個(gè),多呆啊官疲!

沒(méi)占滿的帶寬(10M帶寬)袱结,1%的CPU占用率(筆者的是i7 6700K)亮隙,要不要
那么浪費(fèi),所以垢夹,不搞點(diǎn)多線程溢吻,多進(jìn)程,協(xié)程這樣的東西提高下資源利用
率果元,怎么也說(shuō)不過(guò)去吧促王?然而關(guān)于線程這種話題,一般都是會(huì)讓很多新手
玩家望而卻步而晒,而且聽(tīng)說(shuō)Python里還有什么全局解釋器鎖(GIL)蝇狼,搞得Py無(wú)法
實(shí)現(xiàn)高效的多線程,一聽(tīng)就感覺(jué)很難:

虛個(gè)卵子哦倡怎,跟著小豬把Python里和多線程相關(guān)的東西都擼一遍吧迅耘!
本節(jié)主要是對(duì)一些概念進(jìn)行了解~


1.程序,進(jìn)程监署,線程颤专,多線程,多進(jìn)程

多線程與多進(jìn)程的理解

操作系統(tǒng)原理相關(guān)的書(shū)钠乏,基本都會(huì)提到一句很經(jīng)典的話:
"進(jìn)程是資源分配的最小單位栖秕,線程則是CPU調(diào)度的最小單位"。

說(shuō)到進(jìn)程晓避,如果你是windows的電腦的話簇捍,Ctrl+Alt+Del打開(kāi)任務(wù)
管理器只壳,可以看到當(dāng)前電腦上正在運(yùn)行的很多個(gè)進(jìn)程,網(wǎng)易云啊垦写,
QQ吕世,微信啊,等等梯投;這就是多進(jìn)程命辖,只是每個(gè)進(jìn)程各司其職完成
對(duì)應(yīng)的功能而已,播放分蓖、聊天尔艇,互不干擾。這是吃瓜群眾的看法么鹤,
而對(duì)于我們開(kāi)發(fā)來(lái)說(shuō)终娃,多進(jìn)程的概念更傾向于:多個(gè)進(jìn)程協(xié)同地去完成
同一項(xiàng)工作,為什么要在應(yīng)用里使用多線程蒸甜,個(gè)人的看法如下:
為了擺脫系統(tǒng)的一些限制和為自己的應(yīng)用獲取更多的資源棠耕,舉個(gè)例子:
在Android中為每個(gè)應(yīng)用(進(jìn)程)限制類(lèi)最大內(nèi)存,單個(gè)進(jìn)程超過(guò)這個(gè)
閥值是會(huì)OOM的柠新,而使用多進(jìn)程技術(shù)可以減少內(nèi)存溢出的問(wèn)題窍荧;
再舉個(gè)例子:Python在實(shí)現(xiàn)Python解析器(CPython)時(shí)引入GIL鎖
這種東西,使得任何時(shí)候僅有一個(gè)線程在執(zhí)行恨憎,多線程的效率還
可能比不上單線程蕊退,使用多線程可以規(guī)避這個(gè)限制。

說(shuō)完多進(jìn)程憔恳,然后說(shuō)下多線程瓤荔,首先為何會(huì)引入線程呢?舉個(gè)例子:
你有一個(gè)文本程序钥组,接收用戶的輸入输硝,顯示到屏幕上,并保存到硬盤(pán)里程梦,
由三個(gè)進(jìn)程組成:輸入接收進(jìn)程A点把,顯示內(nèi)容進(jìn)程B,寫(xiě)入硬盤(pán)進(jìn)程C作烟,
而他們之間共同需要要擁有的東西——文本內(nèi)容愉粤,因?yàn)檫M(jìn)程A,B拿撩,C
運(yùn)行在不同的內(nèi)存空間衣厘,這就涉及到進(jìn)程通信問(wèn)題了,而頻繁的切換
勢(shì)必導(dǎo)致性能上的損失。有沒(méi)有一種機(jī)制使得做這三個(gè)任務(wù)時(shí)共享資源呢影暴?
這個(gè)時(shí)候線程(輕量級(jí)的進(jìn)程)就粉墨登場(chǎng)啦错邦!感覺(jué)就像進(jìn)程又開(kāi)辟了
一個(gè)小世界一樣:系統(tǒng) -> 進(jìn)程 -> 線程,系統(tǒng)里有很多進(jìn)程型宙,進(jìn)程里
又有很多線程撬呢。(有點(diǎn)像斗破小說(shuō)那種套路...)

相信到這里你對(duì)多進(jìn)程和多線程的概念就應(yīng)一清二楚了,簡(jiǎn)單比較下
兩者的區(qū)別與使用場(chǎng)景吧:(摘自:淺談多進(jìn)程多線程的選擇)

對(duì)比維度 多進(jìn)程 多線程
數(shù)據(jù)共享妆兑、同步 數(shù)據(jù)共享復(fù)雜魂拦,需要用IPC;
數(shù)據(jù)是分開(kāi)的搁嗓,同步簡(jiǎn)單
共享進(jìn)程數(shù)據(jù)芯勘,數(shù)據(jù)共享簡(jiǎn)單,
但也是因?yàn)檫@個(gè)原因?qū)е峦綇?fù)雜
內(nèi)存腺逛、CPU 占用內(nèi)存多荷愕,切換復(fù)雜,CPU利用率低 占用內(nèi)存少棍矛,切換簡(jiǎn)單安疗,CPU利用率高
創(chuàng)建銷(xiāo)毀、切換 創(chuàng)建銷(xiāo)毀够委、切換復(fù)雜荐类,速度慢 創(chuàng)建銷(xiāo)毀、切換簡(jiǎn)單慨绳,速度很快
編程掉冶、調(diào)試 編程簡(jiǎn)單真竖,調(diào)試簡(jiǎn)單 編程復(fù)雜脐雪,調(diào)試復(fù)雜
可靠性 進(jìn)程間不會(huì)互相影響 一個(gè)線程掛掉將導(dǎo)致整個(gè)進(jìn)程掛掉
分布式 適應(yīng)于多核、多機(jī)分布式恢共;如果一臺(tái)
機(jī)器不夠战秋,擴(kuò)展到多臺(tái)機(jī)器比較簡(jiǎn)單
適應(yīng)于多核分布式

2.線程的生命周期

各個(gè)狀態(tài)說(shuō)明:

  • 1.New(新建),新創(chuàng)建的線程進(jìn)過(guò)初始化讨韭,進(jìn)入Runnable(就緒)狀態(tài)脂信;
  • 2.Runnable(就緒),等待線程調(diào)度透硝,調(diào)度后進(jìn)入Running(運(yùn)行)狀態(tài)狰闪;
  • 3.Running(運(yùn)行),線程正常運(yùn)行濒生,期間可能會(huì)因?yàn)槟承┣闆r進(jìn)入Blocked(堵塞)
    狀態(tài)(同步鎖埋泵;調(diào)用了sleep()和join()方法進(jìn)入Sleeping狀態(tài);執(zhí)行wait()
    方法進(jìn)入Waiting狀態(tài),等待其他線程notify通知喚醒)丽声;
  • 4.Blocked(堵塞)礁蔗,線程暫停運(yùn)行,解除堵塞后進(jìn)入Runnable(就緒)狀態(tài)
    重新等待調(diào)度雁社;
  • 5.Dead(死亡):線程完成了它的任務(wù)正常結(jié)束或因異常導(dǎo)致終止浴井;

3.并行與并發(fā)

并行是同時(shí)處理多個(gè)任務(wù),而并發(fā)則是處理多個(gè)任務(wù)霉撵,而不一定要同時(shí)磺浙,
并行可以說(shuō)是并發(fā)的子集。


4.同步與異步

同步:線程執(zhí)行某個(gè)請(qǐng)求徒坡,如果該請(qǐng)求需要一段時(shí)間才能返回信息屠缭,
那么這個(gè)線程會(huì)一直等待,直到收到返回信息才能繼續(xù)執(zhí)行下去崭参;

異步:線程執(zhí)行完某個(gè)請(qǐng)求呵曹,不需要一直等,直接繼續(xù)執(zhí)行后續(xù)操作何暮,
當(dāng)有消息返回時(shí)系統(tǒng)會(huì)通知線程進(jìn)程處理奄喂,這樣可以提高執(zhí)行的效率;
異步在網(wǎng)絡(luò)請(qǐng)求的應(yīng)用非常常見(jiàn)~


5.線程同步安全問(wèn)題

當(dāng)有兩個(gè)或以上線程在同一時(shí)刻訪問(wèn)同一資源海洼,可能會(huì)帶來(lái)一些問(wèn)題跨新,
比如:數(shù)據(jù)庫(kù)表不允許插入重復(fù)數(shù)據(jù),而線程1,2都得到了數(shù)據(jù)X坏逢,然后
線程1,2同時(shí)查詢(xún)了數(shù)據(jù)庫(kù)域帐,發(fā)現(xiàn)沒(méi)有數(shù)據(jù)X,接著兩線程都往數(shù)據(jù)庫(kù)中
插入了X是整,然后就GG啦肖揣,這就是線程的同步安全問(wèn)題,而這里的數(shù)據(jù)庫(kù)
資源我們又稱(chēng)為:臨界資源(共享資源)浮入。


6.如何解決同步安全問(wèn)題(同步鎖)

當(dāng)多個(gè)線程訪問(wèn)臨界資源的時(shí)候龙优,有可能會(huì)出現(xiàn)線程安全問(wèn)題;
而基本所有并發(fā)模式在解決線程安全問(wèn)題時(shí)都采用"系列化訪問(wèn)
臨界資源"的方式事秀,就是同一時(shí)刻彤断,只能有一個(gè)線程訪問(wèn)臨界資源,
也稱(chēng)"同步互斥訪問(wèn)"易迹。通常的操作就是加鎖(同步鎖)宰衙,當(dāng)有線程訪問(wèn)
臨界資源時(shí)需要獲得這個(gè)鎖,其他線程無(wú)法訪問(wèn)睹欲,只能等待(堵塞)供炼,
等這個(gè)線程使用完釋放鎖,供其他線程繼續(xù)訪問(wèn)。


7.與鎖有關(guān)的特殊情況:死鎖劲蜻,饑餓與活鎖

有了同步鎖不意味著就一了百了了陆淀,當(dāng)多個(gè)進(jìn)程/線程的操作涉及到了多個(gè)鎖,
就可能出現(xiàn)下述三種情況:

  • 死鎖(DeadLock)

兩個(gè)或以上進(jìn)程(線程)在執(zhí)行過(guò)程中先嬉,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象轧苫,
如果無(wú)外力作用,他們將繼續(xù)這樣僵持下去疫蔓;簡(jiǎn)單點(diǎn)說(shuō):兩個(gè)人互相持有對(duì)方想要的資源含懊,
然后每一方都不愿意放棄自己手上的資源,就一直那樣僵持著衅胀。

死鎖發(fā)生的條件

互斥條件(臨界資源)岔乔;
請(qǐng)求和保持條件(請(qǐng)求資源但不釋放自己暫用的資源);
不剝奪條件(線程獲得的資源只有線程使用完后自己釋放滚躯,不能被其他線程剝奪)雏门;
環(huán)路等待條件:在死鎖發(fā)生時(shí),必然存在一個(gè)”進(jìn)程-資源環(huán)形鏈”掸掏,t1等t2茁影,t2等t1;

如何避免死鎖

破壞四個(gè)條件中的一個(gè)或多個(gè)條件丧凤,常見(jiàn)的預(yù)防方法有如下兩種:
有序資源分配法:資源按某種規(guī)則統(tǒng)一編號(hào)募闲,申請(qǐng)時(shí)必須按照升序申請(qǐng):
1.屬于同一類(lèi)的資源要一次申請(qǐng)完;2.申請(qǐng)不同類(lèi)資源按照一定的順序申請(qǐng)愿待。
銀行家算法:就是檢查申請(qǐng)者對(duì)資源的最大需求量浩螺,如果當(dāng)前各類(lèi)資源都可以滿足的
申請(qǐng)者的請(qǐng)求,就滿足申請(qǐng)者的請(qǐng)求仍侥,這樣申請(qǐng)者就可很快完成其計(jì)算要出,然后釋放它占用
的資源,從而保證了系統(tǒng)中的所有進(jìn)程都能完成访圃,所以可避免死鎖的發(fā)生厨幻。
理論上能夠非常有效的避免死鎖相嵌,但從某種意義上說(shuō)腿时,缺乏使用價(jià)值,因?yàn)楹苌儆羞M(jìn)程
能夠知道所需資源的最大值饭宾,而且進(jìn)程數(shù)目也不是固定的批糟,往往是不斷變化的,
況且原本可用的資源也可能突然間變得不可用(比如打印機(jī)損壞)看铆。

  • 饑餓(starvation)與餓死(starve to death)

資源分配策略有可能是不公平的徽鼎,即不能保證等待時(shí)間上界的存在,即使沒(méi)有
發(fā)生死鎖, 某些進(jìn)程可能因長(zhǎng)時(shí)間的等待否淤,對(duì)進(jìn)程推進(jìn)與相應(yīng)帶來(lái)明顯影響悄但,
此時(shí)的進(jìn)程就是 發(fā)生了進(jìn)程饑餓(starvation),當(dāng)饑餓達(dá)到一定程序即此時(shí)
進(jìn)程即使完成了任務(wù)也 沒(méi)有實(shí)際意義時(shí)石抡,此時(shí)稱(chēng)該進(jìn)程被餓死(starve to death)檐嚣,
典型的例子: 文件打印,采用短文件優(yōu)先策略啰扛,如果短文件太多嚎京,長(zhǎng)文件會(huì)一直
推遲,那還打印個(gè)毛隐解。

  • 活鎖(LiveLock)

特殊的饑餓鞍帝,一系列進(jìn)程輪詢(xún)等待某個(gè)不可能為真的條件為真,此時(shí)進(jìn)程不會(huì)
進(jìn)入blocked狀態(tài)煞茫, 但會(huì)占用CPU資源帕涌,活鎖還有幾率能自己解開(kāi),而死鎖則
無(wú)法自己解開(kāi)续徽。(例子:都覺(jué)得對(duì)方優(yōu)先級(jí)比自己高宵膨,相互謙讓?zhuān)瑢?dǎo)致無(wú)法
使用某資源),簡(jiǎn)單避免死鎖的方法:先來(lái)先服務(wù)策略炸宵。


8.守護(hù)線程

也叫后臺(tái)線程辟躏,是一種為其他線程提供服務(wù)的線程,比如一個(gè)簡(jiǎn)單的例子:
你有兩個(gè)線程在協(xié)同的做一件事土全,如果有一個(gè)線程死掉捎琐,事情就無(wú)法繼續(xù)
下去,此時(shí)可以引入守護(hù)線程裹匙,輪詢(xún)地去判斷兩個(gè)線程是否或者(調(diào)isAlive())瑞凑,
如果死掉就start開(kāi)啟線程,在Python中可以在線程初始化的時(shí)候調(diào)用
setDaemon(True)把線程設(shè)置為守護(hù)線程概页,如果程序中只剩下守護(hù)線程
的話會(huì)自動(dòng)退出籽御。


9.線程并發(fā)的經(jīng)典問(wèn)題:生產(chǎn)中與消費(fèi)者問(wèn)題

說(shuō)到線程并發(fā),不得不說(shuō)的一個(gè)經(jīng)典問(wèn)題就是:生產(chǎn)中與消費(fèi)者問(wèn)題:

兩個(gè)共享固定緩沖區(qū)大小的線程惰匙,生產(chǎn)者線程負(fù)責(zé)生產(chǎn)一定量的數(shù)據(jù)
放入緩沖區(qū)技掏, 而消費(fèi)者線程則負(fù)責(zé)消耗緩沖區(qū)中的數(shù)據(jù),關(guān)鍵問(wèn)題是
需要保證兩點(diǎn):

  • 1.緩沖區(qū)滿的時(shí)候项鬼,生產(chǎn)者不再往緩沖區(qū)中填充數(shù)據(jù)
  • 2.緩存區(qū)空的時(shí)候哑梳,消費(fèi)者不在消耗緩沖區(qū)中的數(shù)據(jù)

聽(tīng)不懂也沒(méi)什么,這個(gè)后面會(huì)寫(xiě)例子的~


10.Python中的GIL鎖

概念

全局解釋器鎖绘盟,用于同步線程的一種機(jī)制鸠真,使得任何時(shí)候僅有一個(gè)線程在執(zhí)行悯仙。
GIL 并不是Python的特性,只是在實(shí)現(xiàn)Python解析器(CPython)時(shí)引入
一個(gè)概念吠卷。換句話說(shuō)锡垄,Python完全可以不依賴(lài)于GIL。

Python解釋器進(jìn)程內(nèi)的多線程是以協(xié)作多任務(wù)方式執(zhí)行的祭隔,當(dāng)一個(gè)線程遇到
I/O操作時(shí)會(huì)釋放GIL偎捎。而依賴(lài)CPU計(jì)算的線程則是執(zhí)行代碼量到一定的閥值,
才會(huì)釋放GIL序攘。而在Python 3.2開(kāi)始使用新的GIL茴她,使用固定的超時(shí)時(shí)間來(lái)指示
當(dāng)前線程放棄全局鎖,就是:當(dāng)前線程持有這個(gè)鎖程奠,且其他線程請(qǐng)求這個(gè)鎖時(shí)丈牢,
當(dāng)前線程就會(huì)再5毫秒后被強(qiáng)制釋放掉該鎖。

多線程在處理CPU密集型操作因?yàn)楦鞣N循環(huán)處理計(jì)數(shù)等瞄沙,會(huì)很快達(dá)到閥值己沛,
而多個(gè)線程來(lái)回切換是會(huì)消耗資源的,所以多線程的效率往往可能還比不上
單線程距境!而在多核CPU上效率會(huì)更低申尼,因?yàn)槎嗪谁h(huán)境下,持有鎖的CPU釋放鎖后垫桂,
其他CPU上的線程都會(huì)進(jìn)行競(jìng)爭(zhēng)师幕,但GIL可能馬上又會(huì)被之前的CPU拿到拿到,
導(dǎo)致其他幾個(gè)CPU上被喚醒后的線程會(huì)醒著等待到切換時(shí)間后又進(jìn)入待調(diào)度
狀態(tài)诬滩,從而造成線程顛簸(thrashing)霹粥,導(dǎo)致效率更低。

問(wèn)題

因?yàn)镚IL鎖的原因疼鸟,對(duì)于CPU密集型操作后控,Python多線程就是雞肋了?

答:是的空镜!盡管多線程開(kāi)銷(xiāo)小浩淘,但卻無(wú)法利用多核優(yōu)勢(shì)!
可以使用多進(jìn)程來(lái)規(guī)避這個(gè)問(wèn)題吴攒,Python提供了multiprocessing
這個(gè)跨平臺(tái)的模塊來(lái)幫助我們實(shí)現(xiàn)多進(jìn)程代碼的編寫(xiě)张抄。
每個(gè)線程都有自己獨(dú)立的GIL,因此不會(huì)出現(xiàn)進(jìn)程間GIL
鎖搶奪的問(wèn)題舶斧,但是也增加程序實(shí)現(xiàn)線程間數(shù)據(jù)通訊和同步
是的成本欣鳖,這個(gè)需要自行進(jìn)行權(quán)衡。


11.Python中對(duì)多線程與多進(jìn)程的支持

Python與線程茴厉,進(jìn)程相關(guān)的官方文檔: 17. Concurrent Execution
https://docs.python.org/3/library/concurrency.html

簡(jiǎn)單介紹下里面的一些模塊泽台,后面會(huì)一個(gè)個(gè)啃~

  • threading —— 提供線程相關(guān)的操作
  • multiprocessing —— 提供進(jìn)程程相關(guān)的操作
  • concurrent.futures —— 異步并發(fā)模塊,實(shí)現(xiàn)多線程和多進(jìn)程的異步并發(fā)(3.2后引入)
  • subprocess —— 創(chuàng)建子進(jìn)程矾缓,并提供鏈接到他們輸入/輸出/錯(cuò)誤管道的方法怀酷,
    并獲得他們的返回碼,該模塊旨在替換幾個(gè)較舊的模塊和功能:os.systemos.spawn*
  • sched —— 任務(wù)調(diào)度(延時(shí)處理機(jī)制)
  • queue —— 提供同步的嗜闻、線程安全的隊(duì)列類(lèi)

還有幾個(gè)是兼容模塊蜕依,比如Python 2.x上用threading和Python 3.x上用thread:

  • dummy_threading:提供和threading模塊相同的接口,2.x使用threading兼容琉雳;
  • _thread:threading模塊的基礎(chǔ)模塊样眠,應(yīng)該盡量使用 threading 模塊替代;
  • dummy_thread:提供和thread模塊相同的接口翠肘,3.x使用threading兼容檐束;

小結(jié)

本節(jié)我們圍繞著線程以及進(jìn)程相關(guān)的概念進(jìn)行了解析,盡管有些
枯燥束倍,但是如果堅(jiān)持看完被丧,相信你對(duì)于線程與進(jìn)程的理解會(huì)更進(jìn)
一步,概念什么都是虛的绪妹,紙上得來(lái)終覺(jué)淺甥桂,絕知此事要躬行
下節(jié)開(kāi)始我們來(lái)通過(guò)寫(xiě)代碼的方式一一學(xué)習(xí)這些模塊吧邮旷!


參考文獻(xiàn)


來(lái)啊,Py交易啊

想加群一起學(xué)習(xí)Py的可以加下婶肩,智障機(jī)器人小Pig糕簿,驗(yàn)證信息里包含:
Pythonpython狡孔,py懂诗,Py加群苗膝,交易殃恒,屁眼 中的一個(gè)關(guān)鍵詞即可通過(guò);

驗(yàn)證通過(guò)后回復(fù) 加群 即可獲得加群鏈接(不要把機(jī)器人玩壞了H杞摇@胩啤!)~~~
歡迎各種像我一樣的Py初學(xué)者问窃,Py大神加入亥鬓,一起愉快地交流學(xué)♂習(xí),van♂轉(zhuǎn)py域庇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嵌戈,一起剝皮案震驚了整個(gè)濱河市覆积,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熟呛,老刑警劉巖宽档,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庵朝,居然都是意外死亡吗冤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)九府,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椎瘟,“玉大人,你說(shuō)我怎么就攤上這事侄旬》挝担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵勾怒,是天一觀的道長(zhǎng)婆排。 經(jīng)常有香客問(wèn)我,道長(zhǎng)笔链,這世上最難降的妖魔是什么段只? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鉴扫,結(jié)果婚禮上赞枕,老公的妹妹穿的比我還像新娘。我一直安慰自己坪创,他們只是感情好炕婶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著莱预,像睡著了一般柠掂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上依沮,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天涯贞,我揣著相機(jī)與錄音,去河邊找鬼危喉。 笑死宋渔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辜限。 我是一名探鬼主播皇拣,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薄嫡!你這毒婦竟也來(lái)了氧急?” 一聲冷哼從身側(cè)響起颗胡,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎态蒂,沒(méi)想到半個(gè)月后杭措,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體费什,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钾恢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸳址。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘩蚪。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稿黍,靈堂內(nèi)的尸體忽然破棺而出疹瘦,到底是詐尸還是另有隱情,我是刑警寧澤巡球,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布言沐,位于F島的核電站,受9級(jí)特大地震影響酣栈,放射性物質(zhì)發(fā)生泄漏险胰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一矿筝、第九天 我趴在偏房一處隱蔽的房頂上張望起便。 院中可真熱鬧,春花似錦窖维、人聲如沸榆综。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼻疮。三九已至,卻和暖如春琳轿,著一層夾襖步出監(jiān)牢的瞬間判沟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工利赋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留水评,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓媚送,卻偏偏與公主長(zhǎng)得像中燥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塘偎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 目錄 一、開(kāi)啟線程的兩種方式 在python中開(kāi)啟線程要導(dǎo)入threading偏瓤,它與開(kāi)啟進(jìn)程所需要導(dǎo)入的模塊mul...
    CaiGuangyin閱讀 2,408評(píng)論 1 16
  • 線程 引言&動(dòng)機(jī) 考慮一下這個(gè)場(chǎng)景杀怠,我們有10000條數(shù)據(jù)需要處理,處理每條數(shù)據(jù)需要花費(fèi)1秒厅克,但讀取數(shù)據(jù)只需要0....
    不浪漫的浪漫_ea03閱讀 362評(píng)論 0 0
  • 引言&動(dòng)機(jī) 考慮一下這個(gè)場(chǎng)景赔退,我們有10000條數(shù)據(jù)需要處理,處理每條數(shù)據(jù)需要花費(fèi)1秒证舟,但讀取數(shù)據(jù)只需要0.1秒硕旗,...
    chen_000閱讀 512評(píng)論 0 0
  • 你(我的大寶)坐在位置上看沈石溪的動(dòng)物小說(shuō),我坐在位置上靜靜的看《整理情緒的力量》女责,周?chē)o靜的漆枚,于你不知道...
    晴冰閱讀 92評(píng)論 0 0
  • Vol.01 舞臺(tái)化電影 首先讓我們來(lái)定義一下何謂舞臺(tái)化電影浪读,以免在很多文章中對(duì)這個(gè)概念感到困惑。 藝術(shù)作品有兩個(gè)...
    心獸與小鹿閱讀 975評(píng)論 2 5