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.
arcgis-desktop
arcgis-10.1
arcpy
python-addin
parallel-processing
base de code 5000
la source
la source
Réponses:
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:
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.
la source