• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    python多進程控制的教程講解(附示例)

    來源:懂視網 責編:小采 時間:2020-11-27 14:11:36
    文檔

    python多進程控制的教程講解(附示例)

    python多進程控制的教程講解(附示例):本篇文章給大家帶來的內容是關于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。multiprocessing簡介multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務器為多核CPU時效果更
    推薦度:
    導讀python多進程控制的教程講解(附示例):本篇文章給大家帶來的內容是關于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。multiprocessing簡介multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務器為多核CPU時效果更

    本篇文章給大家帶來的內容是關于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

    multiprocessing簡介

    multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務器為多核CPU時效果更好,類似于threading模塊。相對于多線程,多進程由于獨享內存空間,更穩定安全,在運維里面做些批量操作時,多進程有更多適用的場景

    multiprocessing包提供了本地和遠程兩種并發操作,有效的避開了使用子進程而不是全局解釋鎖的線程,因此,multiprocessing可以有效利用到多核處理

    Process類

    在multiporcessing中,通過Process類對象來批量產生進程,使用start()方法來啟動這個進程

    1.語法

    multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*)
    
    group: 這個參數一般為空,它只是為了兼容threading.Tread
    target: 這個參數就是通過run()可調用對象的方法,默認為空,表示沒有方法被調用
    name: 表示進程名
    args: 傳給target調用方法的tuple(元組)參數
    kwargs: 傳給target調用方法的dict(字典)參數

    2.Process類的方法及對象

    run()
    該方法是進程的運行過程,可以在子類中重寫此方法,一般也很少去重構

    start()
    啟動進程,每個進程對象都必須被該方法調用

    join([timeout])
    等待進程終止,再往下執行,可以設置超時時間

    name
    可以獲取進程名字,多個進程也可以是相同的名字

    is_alive()
    返回進程是否還存活,True or False,進程存活是指start()開始到子進程終止

    daemon
    守護進程的標記,一個布爾值,在start()之后設置該值,表示是否后臺運行
    注意:如果設置了后臺運行,那么后臺程序不運行再創建子進程

    pid
    可以獲取進程ID

    exitcode
    子進程退出時的值,如果進程還沒有終止,值將是None,如果是負值,表示子進程被終止

    terminate()
    終止進程,如果是Windows,則使用terminateprocess(),該方法對已經退出和結束的進程,將不會執行

    以下為一個簡單的例子:

    #-*- coding:utf8 -*- 
    import multiprocessing
    import time
    
    def work(x):
     time.sleep(1)
     print time.ctime(),'這是子進程[{0}]...'.format(x)
    
    if __name__ == '__main__':
     for i in range(5):
     p = multiprocessing.Process(target=work,args=(i,))
     print '啟動進程數:{0}'.format(i)
     p.start()
     p.deamon = True

    1225714763-5993b00b4eb7b_articlex.png

    當然也可以顯示每個進程的ID

    #-*- coding:utf8 -*- 
    import multiprocessing
    import time
    import os
    
    def work(x):
     time.sleep(1)
     ppid = os.getppid()
     pid = os.getpid()
     print time.ctime(),'這是子進程[{0},父進程:{1},子進程:{2}]...'.format(x,ppid,pid)
    
    if __name__ == '__main__':
     for i in range(5):
     p = multiprocessing.Process(target=work,args=(i,))
     print '啟動進程數:{0}'.format(i)
     p.start()
     p.deamon = True

    2901093574-59a50a956cd8e_articlex.png

    但在實際使用的過程中,并不只是并發完就可以了,比如,有30個任務,由于服務器資源有限,每次并發5個任務,這里還涉及到30個任務怎么獲取的問題,另外并發的進程任務執行時間很難保證一致,尤其是需要時間的任務,可能并發5個任務,有3個已經執行完了,2個還需要很長時間執行,總不能等到這兩個進程執行完了,再繼續執行后面的任務,因此進程控制就在此有了使用場景,可以利用Process的方法和一些multiprocessing的包,類等結合使用

    進程控制及通信常用類

    一、Queue類

    類似于python自帶的Queue.Queue,主要用在比較小的隊列上面
    語法:

    multiprocessing.Queue([maxsize])

    類方法:
    qsize()
    返回隊列的大致大小,因為多進程或者多線程一直在消耗隊列,因此該數據不一定正確

    empty()
    判斷隊列是否為空,如果是,則返回True,否則False

    full()
    判斷隊列是否已滿,如果是,則返回True,否則False

    put(obj[, block[, timeout]])
    將對象放入隊列,可選參數block為True,timeout為None

    get()
    從隊列取出對象

    #-*- coding:utf8 -*-
    from multiprocessing import Process, Queue
    
    def f(q):
     q.put([42,None,'hi'])
    
    if __name__ == '__main__':
     q = Queue()
     p = Process(target=f, args=(q,))
     p.start()
     print q.get() #打印內容: [42,None,'hi']
     p.join()

    二、Pipe類

    pipe()函數返回一對對象的連接,可以為進程間傳輸消息,在打印一些日志、進程控制上面有一些用處,Pip()對象返回兩個對象connection,代表兩個通道,每個connection對象都有send()和recv()方法,需要注意的是兩個或以上的進程同時讀取或者寫入同一管道,可能會導致數據混亂,測試了下,是直接覆蓋了。另外,返回的兩個connection,如果一個是send()數據,那么另外一個就只能recv()接收數據了

    #-*- coding:utf8 -*-
    from multiprocessing import Process, Pipe
    import time
    def f(conn,i):
     print '[{0}]已經執行到子進程:{1}'.format(time.ctime(),i)
     time.sleep(1)
     w = "[{0}]hi,this is :{1}".format(time.ctime(),i)
     conn.send(w)
     conn.close()
    
    if __name__ == '__main__':
     reader = []
     parent_conn, child_conn = Pipe()
     for i in range(4):
     p = Process(target=f, args=(child_conn,i))
     p.start()
     reader.append(parent_conn)
     p.deamon=True
    
     # 等待所有子進程跑完
     time.sleep(3)
     print '
    [{0}]下面打印child_conn向parent_conn傳輸的信息:'.format(time.ctime())
     for i in reader:
     print i.recv()

    輸出為:

    3420055133-59c4d415e67dc_articlex.png

    三、Value,Array

    在進行并發編程時,應盡量避免使用共享狀態,因為多進程同時修改數據會導致數據破壞。但如果確實需要在多進程間共享數據,multiprocessing也提供了方法Value、Array

    from multiprocessing import Process, Value, Array
    
    def f(n, a):
     n.value = 3.1415927
     for i in range(len(a)):
     a[i] = -a[i]
    
    if __name__ == '__main__':
     num = Value('d',0.0)
     arr = Array('i', range(10))
    
     p = Process(target=f, args=(num, arr))
     p.start()
     p.join()
    
     print num.value
     print arr[:]

    *print
    3.1415927
    [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]*

    四、Manager進程管理模塊

    Manager類管理進程使用得較多,它返回對象可以操控子進程,并且支持很多類型的操作,如: list, dict, Namespace、lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value, Array,因此使用Manager基本上就夠了

    from multiprocessing import Process, Manager
    
    def f(d, l):
     d[1] = '1'
     d['2'] = 2
     d[0.25] = None
     l.reverse()
    
    if __name__ == '__main__':
     with Manager() as manager:
     d = manager.dict()
     l = manager.list(range(10))
    
     p = Process(target=f, args=(d, l))
     p.start()
     p.join() #等待進程結束后往下執行
     print d,'
    ',l

    輸出:
    {0.25: None, 1: '1', '2': 2}
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    可以看到,跟共享數據一樣的效果,大部分管理進程的方法都集成到了Manager()模塊了

    五、對多進程控制的應用實例

     #-*- coding:utf8 -*-
     from multiprocessing import Process, Queue
     import time
     
     def work(pname,q):
     time.sleep(1)
     print_some = "{0}|this is process: {1}".format(time.ctime(),pname)
     print print_some
     q.put(pname)
     
     if __name__ == '__main__':
     p_manag_num = 2 # 進程并發控制數量2
     # 并發的進程名
     q_process = ['process_1','process_2','process_3','process_4','process_5']
     q_a = Queue() # 將進程名放入隊列
     q_b = Queue() # 將q_a的進程名放往q_b進程,由子進程完成
     
     for i in q_process:
     q_a.put(i)
     
     p_list = [] # 完成的進程隊列
     while not q_a.empty():
     if len(p_list) <= 2:
     pname=q_a.get()
     p = Process(target=work, args=(pname,q_b))
     p.start()
     p_list.append(p)
     print pname
     
     for p in p_list:
     if not p.is_alive():
     p_list.remove(p)
     
     # 等待5秒,預估執行完后看隊列通信信息
     # 當然也可以循環判斷隊列里面的進程是否執行完成
     time.sleep(5)
     print '打印p_b隊列:'
     while not q_b.empty():
     print q_b.get()

    執行結果:

    1132967470-59a5182251923_articlex.png

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    python多進程控制的教程講解(附示例)

    python多進程控制的教程講解(附示例):本篇文章給大家帶來的內容是關于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。multiprocessing簡介multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務器為多核CPU時效果更
    推薦度:
    標簽: 教程 實例 python
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 97久久精品人人澡人人爽| 日韩一区二区精品观看| 国产一区精品| 国产精品一区二区av| 日本熟妇亚洲欧美精品区| 久久国产精品-国产精品| 无码国产69精品久久久久网站| 国产精品无码国模私拍视频| freesexvideos精品老师毛多| 欧美日韩在线精品一区二区三区激情综合 | 久久国产精品视频| 欧美精品福利视频| 500av导航大全精品| 精品一区二区三区在线观看视频| 亚洲国产精品综合久久一线| 久久亚洲中文字幕精品一区四| 国产精品偷伦视频免费观看了| 四虎国产精品永久地址99| 国产精品久久精品| 国产国产成人精品久久| 国产精品无码无卡在线播放| 国产精品无套内射迪丽热巴| 人妻熟妇乱又伦精品视频| 亚洲AV无码成人精品区蜜桃| 亚洲午夜国产精品无码老牛影视| 午夜三级国产精品理论三级 | 久久精品不卡| 国产日韩高清三级精品人成| 91无码人妻精品一区二区三区L| 99re热这里只有精品视频中文字幕| 久久精品天天中文字幕人妻| 亚洲精品你懂的在线观看| 午夜三级国产精品理论三级 | 国产成人精品综合在线观看| 亚洲国产精品久久66| 国产精品久久久久影院嫩草| 国产l精品国产亚洲区在线观看| 精品人妻大屁股白浆无码| 精品久久人妻av中文字幕| 久久精品亚洲中文字幕无码麻豆| 嫩草伊人久久精品少妇AV|