博客列表 >Python多进程——进程池的开启和多进程操作同一个List

Python多进程——进程池的开启和多进程操作同一个List

IPIDEA全球HTTP
IPIDEA全球HTTP原创
2022年10月13日 14:05:09641浏览


为什么要使用多进程

目标网站数据量多,想赶时间多获取点东西?

数据库大批量的数据需要操作?

单纯的想要节省时间,早早下班?

............

肯定会有人说【多线程】。Python的多线程为了数据安全设置了GIL全局解释器锁,而Python的多线程是靠并发的方式实现的,即Python只会在一个进程里永远执行一个线程。

这就导致Python多线程的多线程效率低下。举个例子,这就相当于一个人在左右横跳的吃两包薯片。只不过这个人啊,他速度很快,只要左右横跳的速度足够快,他的残影就像两个人再吃薯片一样。【累不累啊】

所以说你干脆再拉个人跟你一起吃薯片得了。【薯片那么好吃,下次换个例子】

怎么使用多进程

这里重点说的时线程池Pool,Process按下不表,因为Process时动态生成进程,Pool显然比Process强大得多。

实现多进程的方法就是使用Python中的multiprocessing的包。

import multiprocessing as mp

这里就简写一下吧,包名也太长了。

1. pool = mp.Pool(processes=4)  
2. for i in range(4):  
3.     pool.apply_async(方法, (参数,))  
4. pool.close()  
5. pool.join()

其中的process=4是创建线程池的最大值是4,pool的apply_async方法来创建子进程。其中apply_async的方法参数是不带括号()的。带括号是对函数的调用。apply_async传的是target参数。

多进程共同操作List

进程之间的数据操作是独立的。假如你想把每个进程产生的结果存放在同一个list,需要用到multiprocessing中的Manager方法:

1. def __init__(self):  
2.     self.manager = mp.Manager  
3.     self.reslist = self.manager().list()

这样创建list,无论是读取,都可以进行多进程同时操作。如果用本地IP一直去请求的话,会有IP封锁的可能性出现,导致无法正常获取。所以,需要高效请求的话,优质稳定的代理IP必不可少,我这里使用的ipidea代理。

地址:http://www.ipidea.net/,首次可以白嫖流量哦。

举个例子

下面举一个ABCD四个打工人共同处理一个问题的情况:

1. import multiprocessing as mp  
2. from loguru import logger  
3.    
4. class work():  
5.    
6.     def __init__(self):  
7.         self.manager = mp.Manager  
8.         self.works = self.manager().list()  
9.         self.members = ["A","B","C","D"]  
10.    
11.     def create_works(self):  
12.         for i in range(1000):  
13.             self.works.append(i)  
14.    
15.     def finish_works(self,who):  
16.         while len(self.works) > 0:  
17.             finish = self.works.pop()  
18.             logger.info(f'{who}完成了{finish}')  
19.    
20.     def start(self):  
21.         self.create_works()  
22.         pool = mp.Pool(processes=4)  
23.         for i,member in enumerate(self.members):  
24.             pool.apply_async(self.finish_works, (member,))  
25.         pool.close()  
26.         pool.join()  
27.    
28. if __name__ == '__main__':  
29.     work().start()

1.png

实现了四个人同时处理工作,效率也会提升很多。

总结

目前Python提升效率,就是并行跟并发。然而受限于Python的语言环境,多进程的效率会比多线程Thread好上一些。总之选择好自己的方法,合适的情况下合理的使用并行或者并发,对代码处理的提升会有很大的帮助。

 

 

 

 

 


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议