上篇介绍了Python的多线程,python的多线程是不能利用多核CPU的,若是想利用多核CPU的话,就得使用多进程。python中多进程使用multiprocessing模块。python
一、python多进程实例以下:多线程
1 import multiprocessing,time 2 def down_load(): 3 time.sleep(1) 4 print("运行完了") 5 6 if __name__ == '__main__': 7 start_time=time.time() 8 for i in range(5): 9 p = multiprocessing.Process(target=down_load) #建立一个进程 10 p.start() #启动进程 11 while len(multiprocessing.active_children())!=0:#等待子进程结束,效果同于join 12 pass 13 end_time=time.time() 14 print(multiprocessing.current_process()) #输出当前运行的线程 15 print(end_time-start_time) 16 print('end')
=======================================执行结果========================================
运行完了
运行完了
运行完了
运行完了
运行完了
<_MainProcess(MainProcess, started)>
1.1728615760803223
endapp
二、进程池poolasync
使用进程池能够快速的启动几个进程,进程池的好处的就是它会自动管理进程数,咱们只须要给它设置一个最大的值。有新的请求提交到Pool中时,若是池尚未满,那么就会建立一个新的进程用来执行该请求;但若是池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用以前的进程来执行新的任务。函数
1 from multiprocessing import Pool 2 import os 3 4 5 def worker(msg): 6 print("%s开始执行,进程号为%d" % (msg,os.getpid())) 7 8 if __name__ == '__main__': 9 10 po = Pool(3) # 定义一个进程池,最大进程数3 11 for i in range(0, 10): 12 # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,)) 13 # 每次循环将会用空闲出来的子进程去调用目标 14 po.apply_async(func=worker,args=(i,)) 15 #第一个func参数指定运行的函数,第二个args是参数,没有参数能够不写 16 print("----start----") 17 po.close() # 关闭进程池,关闭后po再也不接收新的请求 18 po.join() # 等待po中全部子进程执行完成,必须放在close语句以后 19 print("-----end-----")
================================执行结果===================================
----start----
0开始执行,进程号为238231开始执行,进程号为23824spa
2开始执行,进程号为23825
3开始执行,进程号为23823
4开始执行,进程号为23824
5开始执行,进程号为23823
6开始执行,进程号为23825
7开始执行,进程号为23824
8开始执行,进程号为23823
9开始执行,进程号为23824
-----end-----线程