ArcGIS 10.1 Python AddIn Verwenden von Multiprocessing-Abstürzen ArcMap?

20

Ich möchte eine Multiprocessing-Task mit einem Python-Add-In-Tool ausführen. Mein Problem ist, dass der Prozess immer wieder fehlschlägt. Grundsätzlich stürzt ArcMap ab.

Hier ist mein Basiscode:

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'

Wenn ich den Code außerhalb von ArcMap oder in einer Toolbox ausführe, funktioniert er problemlos, aber wenn ich die Logik in eine Schaltfläche einbaue, stürzt arcmap ab.

Ich vermute, dass ArcMap für alle Python-Add-Ins in Bearbeitung ist. Gibt es eine Lösung für dieses Problem?

Ich habe versucht, dem Code auch freeze_support () hinzuzufügen, aber das hat auch nichts gebracht.

Codebasis 5000
quelle
1
Wenn ArcMap abstürzt, wenden Sie sich an Ihren ESRI-Support. Wenn sie es replizieren können, werden sie einen Fehler feststellen (und ihn vielleicht sogar eines Tages beheben).
GIS-Jonathan
Haben Sie alle 5 Service Packs für ArcGIS 10.x installiert, die bereits veröffentlicht wurden? Vielleicht hilft das
Sergios Kolios
Das OP verwendet 10.1
Petr Krebs
Außerdem sind Service Packs kumulativ, sodass Sie nur das neueste installieren müssen, nicht jeweils nacheinander.
blah238
SP1 für 10.1 wurde diese Woche veröffentlicht.
Timothy Michael

Antworten:

8

Parallelverarbeitung ist einfacher "gezeigt als getan". Wenn ich das alles in einen Knopf packe, schätze ich zwei Probleme:

  1. Mehrere Threads blockieren den ArcMap-UI-Thread oder
  2. ArcMap legt eine eigene Schemasperre für die Datenquelle fest und gewährt dem Python-Prozess keinen Zugriff auf die Daten.

Ein weiteres Problem wurde hier auf einer Seite mit ArcGIS-Ressourcen dokumentiert . Schemasperre sieht aus wie der Täter.

WolfOdrade
quelle
Ich bin nicht sicher, ob Sie beabsichtigten, etwas anderes als das, was Sie getan haben, zu verlinken (ein Beitrag in einem ArcGIS-Forum, kein offizielles Dokument).
blah238
Das Forum ist der richtige Link. Wenn jemand mehr offizielle Dokumente findet, kann er diese gerne posten.
WolfOdrade
Vielen Dank für Ihre Anregungen. Ich glaube, es wird tatsächlich von # 1 verursacht. Die Thread-Blöcke für die ArcMap-Benutzeroberfläche. Ich verwende eine SDE-Datenbank, daher sind Schemasperren hier nicht meine Probleme.
Code Base 5000