本文测试的是在生产者与消费者模式下,多个进程与用进程池管理的多个进程谁跟快
依赖库:
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
第二次实验,两者各有胜负,依旧差不多,但是线程池明显要便捷很多
结论:以后写