python 多进程并发

前言

最近在处理大数据相关的东西,数据动辄上百万,还不能用 GPU 加速,于是开始动起了多进程的念头。众所周知,Python 的多线程是假的,不过好在开发者老大还是给我们留了一个活路,也就是进程池。这个方法的优点在于进程的并发细节完全不用我们操心,我们只需要把并发的任务仍到进程池里就好了。

直接使用进程池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import multiprocessing

def mission(param1):
	print(param1)

# 设置一个允许3个进程并发的进程池
pool = multiprocessing.Pool(processes = 3)
for i in range(1000):
	# 将进程仍入进程池,mission 后面的这个含有 i 的tuple 代表给mission的参数
	pool.apply_async(mission, (i))
	
# 扔了 1000个进程进进程池后,关闭进程池,不允许新的进程加入
pool.close()
# 运行进程池中的进程
pool.join()
	

一些说明

  1. 示例中使用的是apply_async这个代表是非阻塞的,意味着输出不保证顺序,而apply阻塞的,输出是按照输入顺序输出的。
  2. pool.terminate() 代表着结束工作进程,不再处理未完成的任务
  3. pool.join() 阻塞主进程,等待子进程的推出, join 要在 closeterminate 之后使用。
  4. 进程数大家可以按需要调整,它不是越大越好,也不是说 CPU 只有 4 个核就只能开到 4,在个人的 PC 上,开到 10 会有一个很明显的提升,在个人任务中,速度提升了至少 7 倍左右。

参考

  • 本文作者: Author:DeamoV
  • Github:https://github.com/Duan-JM
  • Email:vincent.duan95@outlook.com
  • 本文链接: Artical: python 多进程并发
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 版权声明: 原创文章如转载,请注明出处