python多線程秀菱、多進(jìn)程、協(xié)程的使用

python多線程蹭睡、多進(jìn)程衍菱、協(xié)程的使用

本文主要介紹多線程、多進(jìn)程肩豁、協(xié)程的最常見使用脊串,每個(gè)的詳細(xì)說明與介紹有時(shí)間會在以后的隨筆中體現(xiàn)。

一清钥、多線程

1.python通過兩個(gè)標(biāo)準(zhǔn)庫thread和threading提供對線程的支持琼锋。thread提供了低級別的、原始的線程以及一個(gè)簡單的鎖祟昭。threading通過對thread模塊進(jìn)行二次封裝缕坎,提供了更方便的API來操作線程。接下來只介紹threading的常見用法篡悟。

2.使用

import threadingimport time def Traversal_5(interval):

? ? foriinxrange(5):

? ? ? ? print'Traversal_5:',i

? ? ? ? time.sleep(interval)def Traversal_10(interval):

? ? foriinxrange(10):

? ? ? ? print'Traversal_10:',i

? ? ? ? time.sleep(interval)if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? tasks=[Traversal_5,Traversal_10]

? ? threads = []

? ? fortaskin tasks:

? ? ? ? t = threading.Thread(target=task,args=(1,))

? ? ? ? threads.append(t)

? ? fortin threads:

? ? ? ? t.setDaemon(True)

? ? ? ? t.start()

? ? fortin threads:

? ? ? ? t.join()

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

4.結(jié)果分析

單線程運(yùn)行這完兩個(gè)函數(shù)至少應(yīng)該需要15秒谜叹,多線程情況下,兩個(gè)函數(shù)同時(shí)運(yùn)行搬葬,總共用時(shí)是取最長的Traversal_10這個(gè)函數(shù)的時(shí)間

二荷腊、多進(jìn)程

1.由于GIL的存在,python中的多線程其實(shí)并不是真正的多線程急凰,如果想要充分地使用多核CPU的資源女仰,在python中大部分情況需要使用多進(jìn)程。Python提供了非常好用的多進(jìn)程包multiprocessing抡锈,與threading.Thread類似疾忍,它可以利用multiprocessing.Process對象來創(chuàng)建一個(gè)進(jìn)程。接下來只介紹multiprocessing的常見用法企孩。

2.使用

import multiprocessing import time class Traversal(object):

? ? def__init__(self,interval, name):

? ? ? ? self.interval = interval

? ? ? ? self.name = name

? ? ? ? self._rungevent(self.interval, self.name)

? ? def _rungevent(self, interval, name):

? ? ? ? foriinxrange(5):

? ? ? ? ? ? print'process name:',name,'\tindex:',i

? ? ? ? ? ? time.sleep(interval)if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? jobs = []

? ? forxinxrange(2):

? ? ? ? p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))

? ? ? ? p.start()

? ? ? ? jobs.append(p)

? ? forjobin jobs:

? ? ? ? job.join()

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

4.結(jié)果分析

此程序相當(dāng)于遍歷兩次0-5的函數(shù)锭碳,按理說,時(shí)間應(yīng)該是10秒勿璃,因?yàn)殚_了2個(gè)進(jìn)程擒抛,所以總花時(shí)和一次遍歷時(shí)間相等

三、協(xié)程

1.協(xié)程补疑,又稱微線程歧沪,纖程。協(xié)程的特點(diǎn)在于是一個(gè)線程執(zhí)行莲组,那和多線程比诊胞,協(xié)程有何優(yōu)勢?最大的優(yōu)勢就是協(xié)程極高的執(zhí)行效率。因?yàn)樽映绦蚯袚Q不是線程切換撵孤,而是由程序自身控制迈着,因此,沒有線程切換的開銷邪码,和多線程比裕菠,線程數(shù)量越多,協(xié)程的性能優(yōu)勢就越明顯闭专。第三方的gevent為Python提供了比較完善的協(xié)程支持奴潘。接下來只介紹gevent用法

2.使用

fromgeventimport monkey; monkey.patch_all(); fromgevent.poolimport Pool import time def Traversal(job):

? ? print'job:',job

? ? time.sleep(1)if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? jobs = [iforiinxrange(10)]

? ? pool = Pool(5)

? ? pool.map(Traversal, jobs)

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

3.結(jié)果分析

此程序本質(zhì)是遍歷0-10之間的數(shù),應(yīng)該用時(shí)10秒影钉,由于使用了協(xié)程画髓,開啟了5個(gè)池,所以時(shí)間減少到2秒平委,大大減少運(yùn)行時(shí)間奈虾。

四、多進(jìn)程+協(xié)程

1.因?yàn)閰f(xié)程是一個(gè)線程執(zhí)行肆汹,那怎么利用多核CPU呢愚墓?最簡單的方法是多進(jìn)程+協(xié)程,既充分利用多核昂勉,又充分發(fā)揮協(xié)程的高效率浪册,可獲得極高的性能。

2.使用

import multiprocessing fromgeventimport monkey; monkey.patch_all(); fromgevent.poolimport Poolimport time def Traver(job):

? ? print'job:',job

? ? time.sleep(1)class Traversal(object):

? ? def__init__(self,interval, name):

? ? ? ? self.interval = interval

? ? ? ? self.name = name

? ? ? ? self._rungevent(self.interval, self.name)

? ? def _rungevent(self, interval, name):

? ? ? ? jobs = [iforiinxrange(5)]

? ? ? ? pool = Pool(5)

? ? ? ? pool.map(Traver, jobs) if__name__=='__main__':

? ? print'start time:'? ? t1 = int(time.time())

? ? jobs = []

? ? forxinxrange(2):

? ? ? ? p = multiprocessing.Process(target = Traversal, args=(1,'Traversal_'+str(x)))

? ? ? ? p.start()

? ? ? ? jobs.append(p)

? ? forjobin jobs:

? ? ? ? job.join()

? ? print'end main total time:',int(time.time())-t1

3.結(jié)果

4.結(jié)果分析

此程序本質(zhì)上是遍歷2次0-5之間數(shù)據(jù)岗照,應(yīng)該使用10秒才能運(yùn)行完村象,由于開啟了兩個(gè)線程和5個(gè)池的協(xié)程,結(jié)果1秒就運(yùn)行完了攒至。

五厚者、總結(jié)

從以上小例子看,多進(jìn)程迫吐、多線程和協(xié)程沒有啥差別库菲,本文也只是主要介紹其用法。但是志膀,要是在IO密集和CPU密集的任務(wù)下熙宇,各個(gè)之間的區(qū)別就會顯現(xiàn),這里就不做介紹溉浙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烫止,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子戳稽,更是在濱河造成了極大的恐慌馆蠕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異互躬,居然都是意外死亡播赁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門吨铸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來行拢,“玉大人祖秒,你說我怎么就攤上這事诞吱。” “怎么了竭缝?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵房维,是天一觀的道長。 經(jīng)常有香客問我抬纸,道長咙俩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任湿故,我火速辦了婚禮阿趁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坛猪。我一直安慰自己脖阵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布墅茉。 她就那樣靜靜地躺著命黔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪就斤。 梳的紋絲不亂的頭發(fā)上悍募,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音洋机,去河邊找鬼坠宴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绷旗,可吹牛的內(nèi)容都是我干的喜鼓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼刁标,長吁一口氣:“原來是場噩夢啊……” “哼颠通!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膀懈,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顿锰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼控,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刘陶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牢撼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匙隔。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熏版,靈堂內(nèi)的尸體忽然破棺而出纷责,到底是詐尸還是另有隱情,我是刑警寧澤撼短,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布再膳,位于F島的核電站,受9級特大地震影響曲横,放射性物質(zhì)發(fā)生泄漏喂柒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一禾嫉、第九天 我趴在偏房一處隱蔽的房頂上張望灾杰。 院中可真熱鬧,春花似錦熙参、人聲如沸艳吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讲竿。三九已至,卻和暖如春弄屡,著一層夾襖步出監(jiān)牢的瞬間题禀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工膀捷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迈嘹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓全庸,卻偏偏與公主長得像秀仲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子壶笼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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

  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,766評論 0 8
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 5,974評論 3 28
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進(jìn)程 之前我們已經(jīng)了解了操作系統(tǒng)中進(jìn)程的概念覆劈,程序并不能單獨(dú)運(yùn)行保礼,只有...
    go以恒閱讀 1,646評論 0 6
  • 一文讀懂Python多線程 1沛励、線程和進(jìn)程 計(jì)算機(jī)的核心是CPU,它承擔(dān)了所有的計(jì)算任務(wù)炮障。它就像一座工廠目派,時(shí)刻在運(yùn)...
    星丶雲(yún)閱讀 1,455評論 0 4
  • 目錄 why 環(huán)境搭建 gulp gulpfile.js文件解析 開發(fā)部署流程 1.why 自動清除緩存,自動刷新...
    嗨超兒閱讀 205評論 0 1