最近项目需要做并行计算,于是尝试写了并行计算程序。一般使用并行有好几种方法,包括多线程和多进程。常用的多进程方法是两种:multiprocessing.Process, multiprocessing.Pool.这两种可有优势,但一般Pool可以使用map和apply方法,对于我来说更加方便。
写了个demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import time import multiprocessing cores = multiprocessing.cpu_count()-2 #比自己电脑核少两个,避免主机资源过度占用 pool = multiprocessing.Pool(cores) #实例化池 def calc_des(smi): #测试一个基本函数任务 time.sleep(1) return smi if __name__ == "__main__": test_list = [1,2,3,4,5,6] rl =pool.map(run, test_list) # 映射函数 pool.close()#关闭进程池,不再接受新的进程 pool.join()#主进程阻塞等待子进程的退出 print rl |
运行发现出现卡死,无法弹出结束光标。很是疑惑,几乎就是对照别人的例子来写的,检查了很久,不知道原因。后来折腾半天发现实例化池的时候有问题。修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import time from multiprocessing import Pool def calc_des(smi): #测试一个基本函数任务 time.sleep(1) return smi if __name__ == "__main__": test_list = [1,2,3,4,5,6] pool = Pool(5) #创建拥有5个进程数量的进程池 rl =pool.map(run, test_list) # 映射函数 pool.close()#关闭进程池,不再接受新的进程 pool.join()#主进程阻塞等待子进程的退出 print rl |
有可能是实例化必须在if __name__ == "__main__":里面,也有可能是直接导入import multiprocessing会引起不必要的冲突。
让我想到官网上的一段话:
该软件包中的功能要求子项可以导入 __main__ 模块。这包含在 编程指导 中,但值得指出。这意味着一些示例,例如 multiprocessing.pool.Pool 示例在交互式解释器中不起作用。例如:
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> p = Pool(5) >>> def f(x): ... return x*x ... >>> p.map(f, [1,2,3]) Process PoolWorker-1: Process PoolWorker-2: Process PoolWorker-3: Traceback (most recent call last): AttributeError: 'module' object has no attribute 'f' AttributeError: 'module' object has no attribute 'f' AttributeError: 'module' object has no attribute 'f' |
(如果你尝试这个,它实际上会以半随机的方式输出三个完整的回溯,然后你可能不得不以某种方式停止主进程。)
因此也可能是这个原因导致的。修改后的代码可以正常并行计算。
来源:本站原创
本文原始地址:https://www.ifyoung.net/multiprocessor-error.html
本站所有文章,若标明本站原创,转载请注明出处来自https://www.ifyoung.net/
暂无评论