Python 多進(jìn)程荞下、線程、協(xié)程的簡(jiǎn)單使用

多線程 進(jìn)程 協(xié)程

01 threading實(shí)現(xiàn)多線程

  1. 導(dǎo)入threading模塊
    import threading

  2. 創(chuàng)建對(duì)象

    def sing():
        for i in range(5):
            print("------Singing-----")
            time.sleep(1)
            
    ts = threading.Thread(target=sing)
    

    注意 target參數(shù)只寫函數(shù)名隐岛,不能加括號(hào)猫妙,此時(shí)只創(chuàng)建了對(duì)象,沒有創(chuàng)建線程

  3. 控制子線程

    ts.start()  # 啟動(dòng)子線程
    ts.join([time])  # 等待子線程運(yùn)行完成
    ts.isAlive()  # 返回子線程是否是存活的
    ts.getName()  # 返回子線程名
    ts.setName()  # 設(shè)置子線程名
    

    調(diào)用start之后才創(chuàng)建了子線程聚凹,子線程從start開始執(zhí)行割坠,目標(biāo)函數(shù)結(jié)束后子線程運(yùn)行結(jié)束

  4. 運(yùn)行多個(gè)子線程

    while True:
      length=len(threading.enumerate())
      # print("\n當(dāng)前運(yùn)行的進(jìn)程數(shù):%d\n"%length)
      time.sleep(2)
      if length <= 1:
            print("\n所有子線程已運(yùn)行完成!6恃馈彼哼!\n")
            break
    

    len(threading.enumerate())表示當(dāng)前運(yùn)行的線程數(shù),包括一個(gè)主線程

  5. 通過重載使用多線程

    import threading
    import time
    
    class MyThread(threading.Thread):
        def run(self):
            for i in range(3):
                time.sleep(1)
                print("-----%d-----"%i)
            self.relax()
    
        def relax(self):
            print('-----relax-----\n')
    
    if __name__=='__main__':
        t=MyThread()
        t.start()  
    

    調(diào)用start時(shí)會(huì)自動(dòng)調(diào)用類中的run湘今,因此在類中必須定義run

  6. 互斥鎖

    • 創(chuàng)建鎖(默認(rèn)是不加鎖的) mutex=threading.Lock()
    • 上鎖 mutex.acquire()
    • 解鎖 mutex.release()
    • 判斷是否上鎖 mutex.locker()

02 multiprocessing實(shí)現(xiàn)多進(jìn)程

進(jìn)程與線程的區(qū)別:

  • 進(jìn)程是資源分配的單位敢朱,線程是資源調(diào)度的單位
  • 進(jìn)程需要的資源多 線程需要的資源少
  • 進(jìn)程如同一條流水線 線程如同流水線上的工人
  1. 導(dǎo)入模塊
    import multiprocessing

  2. 創(chuàng)建對(duì)象

    import time
    import multiprocessing
    
    def sing():
        for i in range(5):
            print("------Singing-----")
            time.sleep(1)
            
    def dance():
        for i in range(5):
            print("------Dancing-----")
            time.sleep(1)
            
    def main():
       ts=multiprocessing.Process(target=sing)
       td=multiprocessing.Process(target=dance)
    
       ts.start()   
       td.start()  
    
    if __name__=='__main__':
        main()
    
    
    1. 調(diào)用start后才創(chuàng)建了子進(jìn)程,子進(jìn)程從start開始執(zhí)行摩瞎,子線程函數(shù)結(jié)束后子進(jìn)程運(yùn)行結(jié)束
    2. 子進(jìn)程會(huì)將主進(jìn)程的內(nèi)存復(fù)制拴签,復(fù)制變量的值。 代碼是共享的旗们,不復(fù)制 復(fù)制的越少越好蚓哩,能共享就共享
  3. queue實(shí)現(xiàn)進(jìn)程間通信

    import multiprocessing
    
    # 模擬下載數(shù)據(jù)
    def download_data(q):
        data=[1,2,3,4,5]
        for temp in data:
            q.put(temp)
    
        print('所有數(shù)據(jù)已經(jīng)存入!')
    
    # 模擬處理數(shù)據(jù)
    def data_process(q):
        get_data=list()
        while (q.empty()==False):
            data=q.get()
            get_data.append(data)
        print(get_data)
    
    def main():
        #創(chuàng)建一個(gè)隊(duì)列
        q=multiprocessing.Queue()  
        
        p1=multiprocessing.Process(target=download_data,args=(q,))
        p2=multiprocessing.Process(target=data_process,args=(q,))
        p1.start()
        p2.start()
    
    if __name__=='__main__':
        main()
    
      1. queue在內(nèi)存中開辟空間上渴,儲(chǔ)存用于通信的數(shù)據(jù)
    
    1. queue只能用于同一個(gè)電腦的同一個(gè)程序

    2. 不指定隊(duì)列大小時(shí)岸梨,根據(jù)內(nèi)存自動(dòng)確定大小

    3. 創(chuàng)建進(jìn)程傳遞參數(shù)時(shí)喜颁,要注意傳遞的是一個(gè)元組,要加逗號(hào)

  4. 進(jìn)程池
    在任務(wù)數(shù)不確定時(shí)盛嘿,往往使用進(jìn)程池

    import multiprocessing
    import os,time,random
    
    def job(msg):
        t_start=time.time()
        print('%s開始執(zhí)行洛巢,進(jìn)程號(hào)為:%d'%(msg,os.getpid()))
        time.sleep(random.random()*3)
        t_stop=time.time()
        t_cost=t_stop - t_start
        print('%s執(zhí)行執(zhí)行完畢括袒,耗時(shí)%0.2fs' % (msg, t_cost))
    
    def main():
        po=multiprocessing.Pool(3)  # 設(shè)置進(jìn)程池容量為3
        for i in range(10):
            po.apply_async(job,(i,))  # 兩個(gè)參數(shù)為要執(zhí)行的函數(shù)名和傳遞參數(shù)元組
    
        print('----start----')
        po.close()  # 關(guān)閉進(jìn)程池
        po.join()  # 等待池中所有進(jìn)程執(zhí)行結(jié)束 必須在close之后
        print('----end----')
    
    if __name__=='__main__':
        main()
    
    1. 創(chuàng)建容納三個(gè)進(jìn)程的進(jìn)程池去執(zhí)行九個(gè)任務(wù)
    2. 進(jìn)程池使用queue通信時(shí)次兆,要使用manager下的queue
      如q=multiprocessing.Manager().Queue()

03 gevent實(shí)現(xiàn)協(xié)程

  1. gevent再遇到延時(shí)函數(shù)時(shí)會(huì)自動(dòng)切換協(xié)程,但要注意需要使用gevent中的延時(shí)函數(shù)锹锰,如將time.sleep()換成gevent.sleep()
    如果想要使用原來的延時(shí)函數(shù)芥炭,可以添加語(yǔ)句:

     gevent.monkey.patch_all()
    
  2. 啟動(dòng)多個(gè)協(xié)程的方法

    gevent.joinall(
        [
            gevent.spawn(f1,5),
            gevent.spawn(f2,5),
            gevent.spawn(f3,5)  # 設(shè)置目標(biāo)函數(shù)并傳遞參數(shù)
        ]
    )
    

    協(xié)程傳遞參數(shù)使用的不是元組

  3. 代碼示例

    from gevent import monkey
    
    gevent.monkey.patch_all()
    
    def f1(n):
        for i in range(n):
            print('f1:',i)
            time.sleep(1)
    
    def f2(n):
        for i in range(n):
            print('f2:',i)
            time.sleep(1)
    
    def f3(n):
        for i in range(n):
            print('f3:',i)
            time.sleep(1)
    
    
    gevent.joinall(
        [
            gevent.spawn(f1,5),
            gevent.spawn(f2,5),
            gevent.spawn(f3,5)
        ]
    )
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恃慧,隨后出現(xiàn)的幾起案子园蝠,更是在濱河造成了極大的恐慌,老刑警劉巖痢士,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彪薛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怠蹂,警方通過查閱死者的電腦和手機(jī)善延,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來城侧,“玉大人易遣,你說我怎么就攤上這事∠佑樱” “怎么了豆茫?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屋摇。 經(jīng)常有香客問我揩魂,道長(zhǎng),這世上最難降的妖魔是什么炮温? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任肤京,我火速辦了婚禮,結(jié)果婚禮上茅特,老公的妹妹穿的比我還像新娘忘分。我一直安慰自己,他們只是感情好白修,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布妒峦。 她就那樣靜靜地躺著,像睡著了一般兵睛。 火紅的嫁衣襯著肌膚如雪肯骇。 梳的紋絲不亂的頭發(fā)上窥浪,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音笛丙,去河邊找鬼漾脂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胚鸯,可吹牛的內(nèi)容都是我干的骨稿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼姜钳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坦冠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哥桥,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤辙浑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拟糕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體判呕,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年送滞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侠草。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡累澡,死狀恐怖梦抢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧哟,我是刑警寧澤奥吩,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蕊梧,受9級(jí)特大地震影響霞赫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肥矢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一端衰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甘改,春花似錦旅东、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至忘嫉,卻和暖如春荤牍,著一層夾襖步出監(jiān)牢的瞬間案腺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工康吵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劈榨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓晦嵌,卻偏偏與公主長(zhǎng)得像同辣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耍铜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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