『Python』多進程處理

來源:互聯網
上載者:User

標籤:targe   ssi   processes   thread   速度   random   import   multi   執行   

嘗試學習python的多進程模組,對比多線程,大概的區別在:

  1.多進程的處理速度更快

  2.多進程的各個子進程之間交換資料很不方便

 

多進程調用方式

  進程基本使用multicore()

  進程池最佳化進程的調用multicore_pool(),在使用進程池的時候,運許函數有return,而基本用法中進程是接收不了return的

  進程隊列用法,大部分方法和python的基本隊列是一致的,

q=mp.Queue() 聲明
q.put() 添加
q.get() 釋放
q.empty() 判斷是不是空的
"""Created on Tue Dec  5 09:00:00 2017@author: hellcat"""import timeimport numpy as npimport threading as tdimport multiprocessing as mpdef job(q):    for i in range(3):        q.put(i)    def multicore():    q=mp.Queue()    ps = [mp.Process(target=job,args=(q,)),         mp.Process(target=job,args=(q,))]  # 基本的子進程建立方法    for p in ps:        p.start()            time.sleep(3)        for p in ps:        p.join()                            # 需要協調結束            while True:        if q.empty() != True:            print(q.get())        else:            breakdef multithread():      q=mp.Queue()    ps = [td.Thread(target=job,args=(q,)),         td.Thread(target=job,args=(q,))]  # 基本的子線程建立方法    for p in ps:        p.start()            time.sleep(3)        for p in ps:        p.join()            while True:        if q.empty() != True:            print(q.get())        else:            breakdef job_pool(q):    res0 = 0    for i in range(np.random.randint(10)):        res0 += i**3    return res0def multicore_pool():    pool = mp.Pool(processes=2)                                  # 初始化進程池,可以指定進程數    res1 = pool.map(job_pool,range(20))                          # map方法線上程池中同時添加多個線程    print(res1)                              # 傳回值為函數的return    res2 = [pool.apply_async(job_pool,(i,)) for i in range(20)]  # 在進程池中單個添加進程    print([res.get() for res in res2])                           # 注意此時每個進程的返回並不直接是return,需要get方法得到的才是return    # for res in res2:    #     print(res.get())    if __name__==‘__main__‘:    # multicore()    # multithread()    multicore_pool()
 進程共用變數 & 進程鎖
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Created on Tue Dec  5 10:15:58 2017@author: hellcat"""import timeimport multiprocessing as mpdef job(v,num,l):  # 需要把共用變數執行個體作為參數傳入才行    l.acquire()  # 進程鎖鎖住    for _ in range(10):        time.sleep(0.1)        v.value += num # 擷取共用變數的值,並進行操作        print(v.value)    l.release()  # 進程鎖釋放def muticore():    l = mp.Lock()  # 執行個體化進程鎖    v = mp.Value(‘i‘,0)  # 執行個體化共用變數    # p = mp.Pool(processes=2)        # p.map(job,((v,1,l),(v,3,l)))    p1 = mp.Process(target=job,args=(v,1,l))    p2 = mp.Process(target=job,args=(v,3,l))    p1.start()    p2.start()    p1.join()    p2.join()    if __name__==‘__main__‘:    muticore()

  不同於多線程使用全域變數就可以以共用變數,多進程必須使用 v = mp.Value(‘i‘,0)這樣的語句聲明變數(其實還可以是mp.Array(‘i‘,[1,2,3]),注意,這裡只能是1維的list,[[1,2]]這樣都是不可以的),並將v作為參數傳給函數,在函數內部使用的時候也需要使用v.value來喚醒其值。

  進程鎖會在鎖住時阻止其他進程使用共用變數,所以可以看到輸出中先執行了10次+1,然後執行了10次+3,而不使用進程鎖+1和+3會無規律的交替進行:

注釋掉進程鎖:

1
4
5
8
9
12
13
16
17
20
21
24
25
28
29
32
33
36
37
40

使用進程鎖(上面代碼沒有注釋掉進程鎖):

1
2
3
4
5
6
7
8
9
10
13
16
19
22
25
28
31
34
37
40

 

『Python』多進程處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.