• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

关闭

返回栏目

关闭

返回python栏目

81 - 自带库 - mutiprocessing - 多进程

作者:

贺及楼

成为作者

更新日期:2024-10-27 18:13:49

mutiprocessing - 多进程

作用:使用计算机的多核
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。
Python 的 multiprocessing 库用于创建多进程程序。它提供了一个易于使用的接口来并行运行多个进程,从而充分利用多核处理器的计算能力。该库允许你创建进程、管理进程池、共享内存和通信。它适用于执行CPU密集型任务,如科学计算、图像处理等,可以显著提高程序的运行效率,是实现并行计算的重要工具。

导入,自带库

  1. import multiprocessing

核数

  1. print (multiprocessing.cpu_count())

Process最简单的应用 - 用不了的用来理解的

  1. import multiprocessing as mp
  2. def job(a,b):
  3. print("aaaaa")
  4. if __name__=="__main__":
  5. p1 = mp.Process(target = job,args = (1,2))
  6. p1.start()
  7. p1.join()
  1. import multiprocessing as mp # 引入multiprocessing
  2. def job(a,b):
  3. print("aaaaa")
  4. if __name__=="__main__":
  5. p1 = mp.Process(target = job,args = (1,2)) # 指定方法
  6. p1.start() # 开始工作
  7. p1.join() # 主进程等待进程池中的所有子进程结束

p1 = mp.Process(target = job,args = (1,2)) # 指定方法理解成要for循环开启

有Queue的应用 — 为了获得数据 - 用不了的用来理解的

  1. import multiprocessing as mp
  2. def job(q):
  3. res = 0
  4. for i in range(1000):
  5. res += i+i**2+i**3
  6. q.put(res)
  7. if __name__=="__main__":
  8. q = mp.Queue()
  9. p1 = mp.Process(target = job,args = (q,))
  10. p2 = mp.Process(target = job,args = (q,))
  11. p1.start()
  12. p2.start()
  13. p1.join()
  14. p2.join()
  15. res1 = q.get()
  16. res2 = q.get()
  17. print(res1)
  18. print(res2)
  19. print(res1 + res2)
  1. import multiprocessing as mp
  2. def job(q):
  3. res = 0
  4. for i in range(1000):
  5. res += i+i**2+i**3
  6. q.put(res) # 3、获得内容
  7. if __name__=="__main__":
  8. q = mp.Queue() # 1、实例化Queue
  9. p1 = mp.Process(target = job,args = (q,)) # 2、传入Queue
  10. p2 = mp.Process(target = job,args = (q,))
  11. p1.start()
  12. p2.start()
  13. p1.join()
  14. p2.join()
  15. res1 = q.get() # 4、获得内容
  16. res2 = q.get()
  17. print(res1)
  18. print(res2)
  19. print(res1 + res2)

pool进程池的应用 — python自己来分配

  1. import multiprocessing as mp
  2. def job(x):
  3. return x*x
  4. def multicore():
  5. pool = mp.Pool()
  6. res = pool.map(job,range(100))
  7. print(res)
  8. if __name__=="__main__":
  9. multicore()
  1. import multiprocessing as mp
  2. def job(x):
  3. return x*x
  4. def multicore():
  5. pool = mp.Pool() # 1、实例化
  6. res = pool.map(job,range(100)) # 2、指定任务
  7. print(res)
  8. if __name__=="__main__":
  9. multicore()

pool高级 — 选择多少个核

  1. import multiprocessing as mp
  2. def job(x):
  3. return x*x
  4. def multicore():
  5. pool = mp.Pool(processes = 2) # 1、实例化,核数,不写就全部一起
  6. res = pool.map(job,range(100))
  7. print(res)
  8. if __name__=="__main__":
  9. multicore()

pool进程池,阻塞方法Pool.apply(),1个1个开,进程间数据有关联

  1. import multiprocessing
  2. import time
  3. def func(name):
  4. print("start: %s" % name)
  5. time.sleep(2)
  6. return "end: %s" % name
  7. if __name__ == "__main__":
  8. name_list = ["winter", "elly", "james", "yule"]
  9. res_list = []
  10. pool = multiprocessing.Pool(3) # 创建一个进程总数为3的进程池
  11. for member in name_list:
  12. res = pool.apply(func, (member,)) # 创建子进程,并执行,不需要start
  13. print(res)
  14. pool.close()
  15. pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool
  16. print("all done...")
  1. start: winter
  2. end: winter
  3. start: elly
  4. end: elly
  5. start: james
  6. end: james
  7. start: yule
  8. end: yule
  9. all done...

pool进程池,非阻塞方法Pool.apply_async(),开四个,for关注结果

  1. import multiprocessing
  2. import time
  3. def func(name):
  4. print("start: %s" % name)
  5. time.sleep(2)
  6. return "end: %s" % name
  7. def func_exp(msg):
  8. print("callback: %s" % msg)
  9. if __name__ == "__main__":
  10. name_list = ["winter", "elly", "james", "yule"]
  11. res_list = []
  12. pool = multiprocessing.Pool() # 创建一个进程总数为3的进程池
  13. for member in name_list:
  14. res = pool.apply_async(func, (member,), callback=func_exp) # 创建子进程,并执行,不需要start
  15. res_list.append(res) #注意这里是append了res,不是res.get(),不然又要阻塞了
  16. for res_mem in res_list:
  17. print(res_mem.get())
  18. pool.close()
  19. pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool
  20. print("all done...")
  1. start: winter
  2. start: elly
  3. start: james
  4. start: yule
  5. callback: end: winter
  6. end: winter
  7. callback: end: elly
  8. end: elly
  9. callback: end: james
  10. end: james
  11. callback: end: yule
  12. end: yule
  13. all done...

有数据库的要在目标方法func上加数据库实例化

  1. def func(i):
  2. mysqldb = pymysql.connect(host="127.0.0.1", user="root", password="123456", db="data",
  3. port=3306, charset="utf8")
  4. mysqlcursor2 = mysqldb.cursor() # 获取指针以操作数据库