進程池VS進程(python)

本文測試的是在生產者與消費者模式下,多個進程與用進程池管理的多個進程誰跟快

依賴庫:

from multiprocessing import Process,Queue,Pool
import time,os

生產者:

def producer(q):
    for i in range(100):  #一開始設置只生產十個包子
        time.sleep(0.1)  #一定是要消費者的1/3以下,否則不夠人喫
        res='包子%s' %i
        q.put(res)
        print('\033[44m%s 生產了 %s\033[0m' %(os.getpid(),res))
    q.put(None) #進程設置爲三,因此發送三個結束信號
    q.put(None)
    q.put(None)

純多進程消費者:

def consumer(q):
    while True:
        res=q.get()
        if res is None:break #收到結束信號則結束
        time.sleep(0.5)
        print('\033[45m%s 喫 %s\033[0m' %(os.getpid(),res))


if __name__ == '__main__':
    start = time.time()
    q=Queue()
    #生產者:造包子廚師
    p1=Process(target=producer,args=(q,))
    p1.start()



    #消費者:喫包子
    c1=Process(target=consumer,args=(q,))
    c2=Process(target=consumer,args=(q,))
    c3 = Process(target=consumer, args=(q,))

    #開始
    c1.start()  
    c2.start()
    c3.start()
    print('造包子')
    c2.join()
    c1.join()
    c3.join()
    print(time.time()-start)

線程池控制:

def comsumer2(res):
    time.sleep(0.5)
    print('\033[45m%s 喫 %s\033[0m' % (os.getpid(), res))

if __name__ == '__main__':
    start = time.time()
    q=Queue()
    #生產者:造包子
    p1=Process(target=producer,args=(q,))
    p1.start()

    #進程池管理的消費者:喫包子
    pools = Pool(processes=3)
    while True:
        n = q.get()
        if (n==None):  #收到結束信號則結束
            break
        pools.apply_async(comsumer2,(n,))
    pools.close()
    pools.join()


    print(time.time()-start)

測試結果:

實驗1:100個包子,各自三個進程

由於不是同時進行的,因此設置三次實驗

線程池1:18.300745487213135s

線程池2:18.054959774017334s

線程池3:17.961004734039307s

純純的進程1:17.781851768493652s

純純的進程2:17.907068967819214s

純純的進程3:17.974420070648193s

第一次實驗,純純的進程險勝,但是其實差不多

實驗2:100個包子,各自六個進程,且小小加速了一下產生包子的速度

線程池1:10.157740116119385s

線程池2:10.041166067123413s

線程池3:9.972941398620605s

純純的進程1:10.203296184539795s

純純的進程2:9.738812446594238s

純純的進程3:9.872073650360107s

第二次實驗,兩者各有勝負,依舊差不多,但是線程池明顯要便捷很多

結論:以後寫

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