首页 > 系统相关 >Python多进程——进程池的开启和多进程操作同一个List

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

时间:2022-10-13 15:10:31浏览次数:84  
标签:__ Python self List 进程 works pool

为什么要使用多进程

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

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

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

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

肯定会有人说【多线程】。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()

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

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

总结

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






标签:__,Python,self,List,进程,works,pool
From: https://blog.51cto.com/u_15811883/5753425

相关文章

  • Python 为什么不支持 switch 语句?
    本文出自“Python为什么”系列,请查看​​全部文章​​在这篇文章里,我们会聊一聊为什么Python决定不支持switch语句。为什么想要聊这个话题呢?主要是因为switch在其它语......
  • 【算法】213-每周一练 之 数据结构与算法(LinkedList)
    这是第三周的练习题,原本应该先发第二周的,因为周末的时候,我的母亲大人来看望她的宝贝儿子,哈哈,我得带她看看厦门这座美丽的城市呀。这两天我抓紧整理下第二周的题目和答案,下面......
  • python IP段指定端口扫描
    #!/usr/bin/python#-*-coding:utf-8-*-#查找哪台电脑开了远程端口fromsocketimport*#3389host='192.168.11.'opened_ports=[]foripinrange(1,2......
  • python版的羊了个羊,你见过没?
     最近不是出了个超火的游戏嘛,周围小伙伴都说好难玩,玩不过 看了下,发现就是个变种的连连看嘛,就尝试下写一个出来玩玩,当作是练手了 刚好找到一位大佬用C语言写的羊......
  • python3 http.server模块 搭建简易 http 服务器
    在命令行直接运行:python-mhttp.server80或python3-mhttp.server80会看到如下输出:ServingHTTPon0.0.0.0port80(http://0.0.0.0:80/)...在浏览器访问会......
  • 驱动开发:内核遍历进程VAD结构体
    在上一篇文章《驱动开发:内核中实现Dump进程转储》中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是VirtualAddressDescriptor即虚拟地......
  • sql server中如何查看被死锁的表和进程
    --查看被锁表:selectrequest_session_idspid,OBJECT_NAME(resource_associated_entity_id)tableNamefromsys.dm_tran_lockswhereresource_type='OBJECT'orderby......
  • 驱动开发:内核遍历进程VAD结构体
    在上一篇文章《驱动开发:内核中实现Dump进程转储》中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是VirtualAddressDescriptor即虚拟......
  • python functools 模块
    pythonfunctools模块常见APIcmp_to_keycmp_to_key()是将比较函数转化为关键字函数。与使用接受关键字函数的方法一同使用,如(sorted(),min(),max()...),改函数主要......
  • SPOJ PHONELST - Phone List | UVA11362 Phone List
    简要题意\(t\)组数据,每组数据给定\(n\)个长度不超过\(10\)的数字串,判断是否有两个字符串\(A\)和\(B\),满足\(A\)是\(B\)的前缀,若有,输出NO,若没有,输出YES。......