Python-併發編程

1. 進程、線程、協程基本概念,創建、使用
2. 協程的應用(生成器----第三方模塊)
3. 併發的實踐

 

一、進程

 

 1.進程的相關概念

 程序運行起來之後創建的一個進程。
 創建進程已經學過使用multiprocessing.Process類創建
(1)multiprocessing.Process(),指定target參數,創建對象
(2)繼承multiprocessing.Process,重寫run方法

需求:通過比較案例的執行時長,來比較不同的創建進程方式的執行速度
案例: io   計算密集型

累加求和方法

import time
def sum(a,b):
    s=0
    for i in range(a,b+1):
        s+=i
        # time.sleep(0.5)
    return s

① 不使用進程,不使用線程,直接執行

計算密集型:1.95s
io 密集型: 16s

if __name__=="__main__":
    start=time.time()
    # sum(0,10000000)
    # sum(0,20000000)
    sum(0,10)
    sum(0,20)
    end=time.time()
    print("執行的時間{}".format(end-start))

2.使用進程池創建進程

進程池:負責維護一定數量(最大)的進程,可以向進程池提交任務,如果進程池中進程數量沒有達到上限,進程池會幫我們創建一個新的進程,執行任務,否則如果進程池中的進程數量已經達到上限,新任務只能在進程池外等待,等待進程池內進程死亡,或者進程結束,才能再次創建新的進程執行任務。

from multiprocessing import Pool 進程池創建進程
方式:
from multiprocessing import Pool
Pool(進程池中最大的數量)
pool=Pool(5)

相關方法:
apply:同步申請模式
apply_async:異步申請模式
close,暫停關閉
terminate,真正關閉進程池所有任務
join 阻塞主進程,等待子進程的退出(跟close聯合使用)

(1)同步申請模式

  串行(排隊執行)

from multiprocessing import Pool
import os
def work():
    print("當前進程的id={}".format(os.getpid()))
    time.sleep(1)

# 使用進程池創建進程(同步模式創建進程)
if __name__=="__main__":
    pool = Pool(5)
    # pool.apply(要執行的任務,args=任務的參數元組)
    for i in range(3):
        pool.apply(work)
        print("第{}個任務執行完畢".format(i))

② 使用同步申請模式實現累加和案例

計算密集型  2.1s
io密集型    16.2s

進程池中使用同步方式申請進程,反而執行的比正常串行慢,因爲向進程池申請進程也需要時間。

def sum2(b1,b2):
    pool=Pool(4)
    pool.apply(sum,args=(0,b1))
    pool.apply(sum,args=(0,b2))

if __name__=="__main__":
    start=time.time()
    # sum2(10000000,20000000)
    sum2(10,20)
    end=time.time()
    print("執行的時間{}".format(end - start))

(2)異步申請模式

異步模式的使用方式

def work(index):
    print("第{}個任務".format(index))
    time.sleep(1)

if __name__=="__main__":
    pool=Pool(4)
    for i in range(3):
        # pool.apply(work,args=(i,))
        pool.apply_async(work,args=(i,))
        # print("第{}個任務執行完畢".format(i)) # 不能保證執行完畢work之後才執行。
    # 使用join搶佔之前需要先關閉(暫時關閉,長久關閉)進程池
    pool.close()
    pool.join()
    print("主進程執行結束")

使用multiprocessing.Pool異步模式申請的子進程被當成是後臺進程。
如果希望子進程全部在主進程執行結束之前全部執行完畢,使用搶佔進程的方式解決join
使用【進程池對象.join搶佔主進程】

未完待續。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章