使用多处理的ArcGIS 10.1 Python加载项会使ArcMap崩溃?


20

我想从python外接程序工具运行多处理任务。我的问题是该过程不断失败。基本上会使ArcMap崩溃。

这是我的基本代码:

def function(startOID, endOID, fc):

    wrksp = r"c:\temp\mp_addintest\data\test_%s.txt" % (int(startOID) + int(endOID))
    # real logic removed to dumb it down
    with open(wrksp, 'w') as writer:
        writer.write("%s to %s from %s \n" % (startOID, endOID, fc))
    return wrksp
class btnMP(object):
    """Implementation for src_addin.MPButton (Button)"""
    def __init__(self):
        self.enabled = True
        self.checked = False
    def onClick(self):
        pool = None
        try:
            pythonExe = os.path.join(sys.exec_prefix, 'python.exe')
            multiprocessing.set_executable(pythonExe)
            pool = multiprocessing.Pool(4)
            results = []
            for i in xrange(4):
                results.append(pool.apply_async(function, [str(1),
                                      str(i),
                                      str("test")]))
            pool.close()
            pool.join()
            for result in results:
                print result.get()
        except:
            del pool
            print 'error'

如果我在ArcMap之外或从工具箱中运行代码,则可以正常工作,但是当我将逻辑放在按钮内时,它将导致arcmap崩溃。

我的猜测是ArcMap正在针对所有python加载项运行。有没有解决此问题的方法?

我也尝试在代码中添加freeze_support(),但这也无济于事。


1
如果ArcMap崩溃,请联系您的ESRI支持。如果他们可以复制它,他们将承认它的错误(甚至有一天可以修复)。
GIS-乔纳森(Jonathan)

您是否已经安装了全部5个ArcGIS 10.x Service Pack?也许会有帮助
Sergios Kolios 2012年

OP正在使用10.1
Petr Krebs

而且Service Pack是累积性的,因此您只需要安装最新的Service Pack,而不是依次安装每个Service Pack。
blah238

本周发布了10.1版的SP1。
蒂莫西·迈克尔

Answers:


8

并行处理“显示难于完成”。在将所有内容塞入按钮的情况下,我猜测两个问题:

  1. 多个线程阻塞了ArcMap UI线程,或者
  2. ArcMap在数据源上放置了自己的架构锁,并且不允许python进程访问数据。

嗯寻找另一个问题已被记录在这里的一个ArcGIS资源页。模式锁看起来像是罪魁祸首。


不确定是否要链接其他内容(ArcGIS论坛帖子,而不是正式文档)。
blah238

该论坛是正确的链接。当有人找到更多官方文档时,他们可以随时发布。
WolfOdrade

谢谢您的建议。我相信这实际上是由#1引起的。ArcMap UI的线程块。我使用的是SDE数据库,因此架构锁不是我的问题。
代码库5000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.