当前位置: 首页 > 后端技术 > Python

Python多进程——进程池的开启和多进程运行是一样的List

时间:2023-03-26 12:22:59 Python

为什么要用多进程目标网站数据量大,想快速获取更多东西?数据库中大量数据需要操作?单纯的想节省时间,早点下班?......肯定有人会说【多线程】。Python的多线程为了数据安全设置了GIL全局解释器锁,Python的多线程是以并发的方式实现的,即Python永远只会在一个进程中执行一个线程。这就导致了Python多线程中多线程的效率低下。比如,这相当于一个人吃着两袋薯片左右跳来跳去。只是这人的速度很快,只要他左右跳跃的速度足够快,他的残影就像是两个人在吃薯片。【累不累】所以不如找人陪你吃薯片。【薯片真好吃,下次再举个例子】如何使用多进程这里重点是线程池Pool,Process就不展示了,因为Process过程中是动态生成的,Pool是显然比Process强大得多。实现多处理的方法是使用Python中的multiprocessing包。importmultiprocessingasmp这里是缩写,包名太长。1.pool=mp.Pool(processes=4)2.foriinrange(4):3.pool.apply_async(method,(parameter,))4.pool.close()5.pool.join()whereprocess=4是创建线程池,最大值为4,池的apply_async方法创建子进程。apply_async的方法参数没有括号()。括号是对函数的调用。apply_async传递目标参数。多进程联合操作List进程之间的数据操作是独立的。如果要将各个进程的结果存储在同一个list中,需要使用multiprocessing中的Manager方法:1.def__init__(self):2.self.manager=mp.Manager3.self.reslist=self.manager().list()这样创建一个list,无论是读,都可以同时被多个进程操作。如果使用本地IP一直请求,有可能IP被封,导致无法正常获取。因此,如果您需要高效的请求,优质稳定的代理IP必不可少。我这里用的是ipidea代理。地址:http://www.ipidea.net/,首发免费卖淫流量。例如,这里有四个ABCDworker一起工作来处理一个问题的情况:1.importmultiprocessingasmp2.fromloguruimportlogger3.4.classwork():5.6.def__init__(self):7。self.manager=mp.Manager8.self.works=self.manager().list()9.self.members=["A","B","C","D"]10.11.defcreate_works(self):12.foriinrange(1000):13.self.works.append(i)14.15.deffinish_works(self,who):16.whilelen(self.works:0)>17.finish=self.works.pop()18.logger.info(f'{who}finished{finish}')19.20.defstart(self):21.self.create_works()22.poolol=mp.Pool(processes=4)23.fori,memberinenumerate(self.members):24.pool.apply_async(self.finish_works,(member,))25.pool.close()26.join()27.28.if__name__=='__main__':29.work().start()可以让四个人同时处理工作,效率会大大提高。总结一下,目前Python效率的提升就是并行和并发。但是受限于Python语言环境,多进程的效率会比多线程Thread好。总之,选择适合自己的方法,在适当的情况下合理使用并行或并发,对提高代码处理能力会有很大的帮助。