ArcGIS 10.1 Python AddIn Using Multiprocessing plante ArcMap?

20

Je voudrais exécuter une tâche de multitraitement à partir d'un outil complémentaire python. Mon problème est que le processus continue d'échouer. Bloque fondamentalement ArcMap.

Voici mon code de base:

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'

Si j'exécute le code en dehors d'ArcMap ou à partir d'une boîte à outils, cela fonctionne sans problème, mais lorsque je mets la logique dans un bouton, arcmap se bloque.

Je suppose qu'ArcMap est en cours d'exécution pour tous les compléments python. Existe-t-il un moyen de contourner ce problème?

J'ai également essayé d'ajouter le freeze_support () au code, mais cela n'a rien fait non plus.

base de code 5000
la source
1
Si ArcMap plante, contactez votre support ESRI. s'ils peuvent le reproduire, ils reconnaîtront que c'est un bug (et peut-être même le corriger un jour).
GIS-Jonathan
Avez-vous installé les 5 Service Packs pour ArcGIS 10.x qui sont déjà sortis? Peut-être que cela vous aidera
Sergios Kolios
L'OP utilise 10.1
Petr Krebs
De plus, les Service Packs sont cumulatifs, vous n'avez donc qu'à installer le dernier, pas chacun à la suite.
blah238
SP1 pour 10.1 a été publié cette semaine.
Timothy Michael

Réponses:

8

Le traitement parallèle est plus facile à montrer qu'à faire. Dans le cas de bourrer tout cela dans un bouton, je suppose que deux problèmes:

  1. Plusieurs threads bloquent le thread ArcMap UI, ou
  2. ArcMap place son propre verrou de schéma sur la source de données et n'autorise pas le processus python à accéder aux données.

Hmm à la recherche d'un autre problème a été documenté ici dans une page de ressources ArcGIS. Le verrouillage du schéma ressemble au coupable.

WolfOdrade
la source
Je ne sais pas si vous vouliez lier quelque chose d'autre que ce que vous avez fait (un message sur les forums ArcGIS, pas un document officiel).
blah238
Le forum est le bon lien. Lorsque quelqu'un trouve plus de documents officiels, il peut se sentir libre de les publier.
WolfOdrade
Merci pour vos suggestions. Je crois que cela est en fait causé par # 1. Les blocs de threads pour ArcMap UI. J'utilise une base de données SDE, donc les verrous de schéma ne sont pas mes problèmes ici.
base de code 5000