python关于pool+map+arcgis's py module并行计算疑惑
学习了
《一行 Python 实现并行化 -- 日常多线程操作的新思路》http://blog.segmentfault.com/caspar/1190000000414339
原作者 Chris https://medium.com/building-things-on-the-internet/40e9b2b36148#66bf-f06f781cb52b 后,
我在用Pool多进程执行并行计算,主要是调用arcgis的py模块,发现一个问题:
我的代码:
files=['E:/select/r0_51x47.txt',
'E:/select/r0_79x77.txt',
'E:/select/r0_89x65.txt',
'e:/select/r0_101x109.txt',
'e:/select/r0_104x88.txt',
'e:/select/r0_127x80.txt',
'e:/select/r0_139x136.txt',
'e:/select/r0_204x209.txt']
print ('')
print ('###################################')
pool_costtime_start= datetime.datetime.now()
pool = Pool()#len(files)
pool.map(ExtractRidge, files)
pool.close()
pool.join()
print ('Pool Cost time: '+\
str((datetime.datetime.now() - pool_costtime_start).seconds)+\
' seconds')
len(files)>CPU数(我的是win7+i5),执行过程中某个进程执行到arcgis提供的函数时,会无限期等待着,如下图:
我的解决方法是:直接设置Pool的大小,即
pool=Pool(len(files))
这样就不会出现之前的情况了,这是成功的结果
同样的,我还测试了用
pool=ThreadPool() 或者
pool=ThreadPool(len(files))
实现多线程的并行计算。这个就更糟糕了,提示:
提示的函数,z_limit是第三个参数,默认值为“”
arcpy.gp.Fill_sa(dem, fill, "")
但是,在指定进程数的情况下确没问题。我的问题是:
1. 对于CPU密集型的计算来说,进程数是否需要严格指定?例如我的第一个情况下,需要指定进程数才能运算成功,默认由计算机CPU个数来决定的情况就会down机;
2. 是否多线程对于CPU密集型的计算容易出错?因为我用的arcgis模块计算量都很大;
**请路过的大神多多指教!**
作为前面几位同学讨论的补充,给出一个可运行例子以说明在multiprocessing模块的进程池中全局对象的生存周期。
foo.py
counter = dict(readed=0)
def readfile(filename):
counter['readed']+=1
print '%s readed %d'%(filename,counter['readed'])
main.py
import time,multiprocessing
files=['a.txt','b.txt','c.txt','d.txt','e.txt']
def dowork(filename):
import foo
time.sleep(2)
foo.readfile(filename)
if __name__ == '__main__':
pool=multiprocessing.Pool(2)
pool.map(dowork,files)
pool.close()
pool.join()
python main.py
输出:
a.txt readed 1
b.txt readed 1
c.txt readed 2
d.txt readed 2
e.txt readed 3
dowork
被调用5次,但foo.py
的全局对象counter
只初始化2次。修改dowork
方法为
def dowork(filename):
from sys import modules
import foo
time.sleep(2)
foo.readfile(filename)
del modules['foo']
python main.py
输出
a.txt readed 1
b.txt readed 1
c.txt readed 1
d.txt readed 1
e.txt readed 1
dowork
被调用5次,foo.py
的全局对象counter
初始化5次,这才是我们所期待的结果。
回到题主的情况,很可能arcpy模块引用并改变某全局对象G。当进程池的进程数=文件数,全局对象G相互间无共享,运行正常;当进程池的进程数<文件数,全局对象G被共享,于是厄运开始...
先回答问题:
回到您的问题。您在使用 multiprocessing
的时候碰到的问题——由于没有您完整的代码——我推测可能有以下两点原因:
对于您的多线程测试,对问题原因的猜测就更多了,比如代码中有一些非线程安全的全局变量,等等等等,需要根据具体任务代码来看。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19819.html
相关文章 Recommend
- • 2019年3月最新消息: Python 3.4.10 现已推出
- • [上海]招Python量化系统开发工程师
- • 优集品网络科技有限公司招Python中/高级工程师
- • 爱因互动科技发展有限公司招募Python开发攻城狮
- • mozio招聘Python/Django工程师
- • Kavout金融科技公司招Python研发工程师
- • Python数组逆向输出,编程练习题实例四十
- • Python数组插入排序,编程练习题实例三十九
- • Python矩阵for循环应用,编程练习题实例三十八
- • Python操作Redis数据库方面的问题
- • 请python高手帮我看看这段python代码中函数setter的
- • Python什么方法可以快速将两个队列变成字典
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
- • qiniu pythonsdk提示ImportError错误求解
- • 问一个关于Hadoop Python中读写文件统计分析
- • 求问str()同__str__原理上有什么不同,分别在
- • 大神帮忙看下20行的python代码,文件io和数
- • python 爬虫爬wiki 报错 [Errno 65] No route to
- • python续点上传问题None bad token...
- • python3环境下文本中超链接出错,要如何修
- • Python环境保存操作思路问题求助
图文精华 RECOMMEND
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
-
python里面为什么系统的时区是东八
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问