本文測試的是在生產者與消費者模式下,多個進程與用進程池管理的多個進程誰跟快
依賴庫:
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
第二次實驗,兩者各有勝負,依舊差不多,但是線程池明顯要便捷很多
結論:以後寫