如何在python实现多进程并发
什么是多进程, 多进程与多线程的区别
进程是cpu资源分配的基本单位。 一个cpu可以运行一个独立的进程。进程之间不共享数据,之间是相互独立。
线程是可供cpu独立调度和分配的比进程更小的单位。一个进程可以有很多线程。 线程之间共享数据。
为什么用多进程
用多进程的本质是为了提高运行效率, 减少运行时间。 因为所有的程序都可以单进程运行, 多进程就是为了能缩短总运行时间。
很多情况下,用线程会增加问题的复杂度。线程需要处理加锁的问题Lock,处理不好的话会降低准确性。
如果处理的任务可以保持独立,多进程是一个很好的选择。能用多进程的地方,就用多进程。
如何用多进程实现并发
调用multiprocessing模块的Pool来做进程管理。这个模块模仿threading的API。
https://docs.python.org/zh-cn/3.7/library/multiprocessing.html
Pool可以自动地将任务分配给空闲的cpu核。如果有任务完成,Pool可以分配新任务给空闲的核。这样调控起来很方便,不用自己再写。
要想做到并发,一定要用apply_async加载函数,而不是apply。apply_async 是非阻塞的异步加载,可以保证进程并发。 只用apply的话,没有并发,只是排队加载。
pool.close() 停止加载函数
pool.join() 执行任务
import multiprocessing as mp
from multiprocessing import Pool
# 用一半的资源
num_cpu_using = int(mp.cpu_count()*0.5)
print("num cores using:", num_cpu_using)
pool = Pool(processes= num_cpu_using)
for arg1 in range(0,10,1):
pool.apply_async(self.func, args = (arg1, arg2, ..))
pool.close()
pool.join()
print("All tasks finished.")