【问题描述】
请用多进程的方式同时爬取多个公司的商誉信息,提高程序执行速度。
输出结果:
运行1次get_all_mp函数花费时间:2.501972198486328秒
【题前思考】
根据问题描述,填写表8-2-1。
表8-2-1 问题分析
【解题思路】
从代码的角度来看,多线程程序和多进程程序的代码是类似的,区别在于多进程方式是使用multiprocessing模块中的Pool类来创建进程池对象,然后调用该对象的map( )方法来并行执行函数。Pool类的map( )方法的参数及返回值的意义与concurrent.futures.ThreadPoolExecutor类的map( )方法相似。
【参考代码】
【代码分析】
①:从multiprocessing模块导入Pool类和cpu_count( )函数。
②:定义函数get_all_mp( )以多进程方式获取公司商誉数据。
③:创建进程池对象p,进程数量为CPU数量。cpu_count( )函数用于取得逻辑CPU数量,如双核四线程CPU将会认为有4个CPU。
④:调用map( )方法以多进程方式并行执行函数get_proportion_of_goodwill( ),各函数参数在列表stocklist中,各函数调用返回值以列表形式返回到变量res。
【技术全貌】
进程池Pool可以自动控制进程。Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果进程池还没有满,就会创建一个新的进程来执行请求;如果池满,请求就会告知先等待,直到池中有进程结束。使用Pool来创建和管理进程的方法见表8-2-2。
表8-2-2 使用Pool创建和管理进程的方法