Me gustaría ejecutar una tarea de multiprocesamiento desde una herramienta de complemento de Python. Mi problema es que el proceso sigue fallando. Básicamente bloquea ArcMap.
Aquí está mi código básico:
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 ejecuto el código fuera de ArcMap o desde una caja de herramientas, funciona sin problemas, pero cuando coloco la lógica dentro de un botón, causa que arcmap se bloquee.
Supongo que ArcMap se está ejecutando en proceso para todos los complementos de Python. ¿Hay alguna solución para este problema?
Intenté agregar el freeze_support () al código también, pero eso tampoco hizo nada.
arcgis-desktop
arcgis-10.1
arcpy
python-addin
parallel-processing
código base 5000
fuente
fuente
Respuestas:
El procesamiento paralelo es más fácil de "mostrar que de hacer". En el caso de poner todo esto en un botón, supongo que dos problemas:
Hmm buscando más problemas se ha documentado aquí en una página de recursos de ArcGIS. Schema lock parece el culpable.
fuente