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.