0

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

 1 year ago
source link: https://blog.51cto.com/u_15811883/5753425
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

为什么要使用多进程

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

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

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

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

肯定会有人说【多线程】。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封锁的可能性出现,导致无法正常获取。

下面举一个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好上一些。总之选择好自己的方法,合适的情况下合理的使用并行或者并发,对代码处理的提升会有很大的帮助。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK