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

为什么要使用多进程
目标网站数据量多,想赶时间多获取点东西?
数据库大批量的数据需要操作?
单纯的想要节省时间,早早下班?
............
肯定会有人说【多线程】。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()  

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

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

17 声望
1 粉丝
0 条评论
推荐阅读
Amazoncaptcha 95%成功率绕过亚马逊IP验证码
这次又来折腾亚马逊了。之前有介绍亚马逊的商品获取和评论获取。但是在批量获取和多次访问的情况下出现了需要验证码的情况:当然,出现这种情况你是肯定获取不到数据的。但是,你离你想要的数据,真的很近了。所...

ipidea阅读 688

正则表达式实例
收集在业务中经常使用的正则表达式实例,方便以后进行查找,减少工作量。常用正则表达式实例1. 校验基本日期格式 {代码...} {代码...} 2. 校验密码强度密码的强度必须是包含大小写字母和数字的组合,不能使用特殊...

寒青56阅读 7.9k评论 11

JavaScript有用的代码片段和trick
平时工作过程中可以用到的实用代码集棉。判断对象否为空 {代码...} 浮点数取整 {代码...} 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。 {代码...} 生成6位数字验证码 {代码...} ...

jenemy46阅读 6k评论 12

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木66阅读 6.2k评论 16

再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...

libinfs39阅读 6.3k评论 12

封面图
从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木44阅读 7.4k评论 6

CSS 绘制一只思否猫
欢迎关注我的公众号:前端侦探练习 CSS 有一个比较有趣的方式,就是发挥想象,绘制各式各样的图案,比如来绘制一只思否猫?思否猫,SegmentFault 思否的吉祥物,是一只独一无二、特立独行、热爱自由的(>^ω^&lt...

XboxYan43阅读 3k评论 14

封面图
17 声望
1 粉丝
宣传栏