ArcGIS 10.1 ¿Complemento de Python usando bloqueos de multiprocesamiento ArcMap?

20

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 se 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, se produce una falla en arcmap.

Mi conjetura es que ArcMap se está ejecutando en proceso para todos los complementos de Python. ¿Hay alguna solución para este problema?

También he intentado agregar el código freeze_support () al código, pero eso tampoco hizo nada.

    
pregunta code base 5000 16.10.2012 - 13:48

1 respuesta

8

El procesamiento paralelo es más fácil "se muestra que se hace". En el caso de rellenar todo esto en un botón, supongo dos problemas:

  1. Varios subprocesos bloquean el subproceso de la interfaz de usuario de ArcMap, o
  2. ArcMap pone su propio bloqueo de esquema en la fuente de datos y no lo hace permitir que el proceso de python acceda a los datos.

Se ha documentado el problema de Hmm buscando más información aquí en una página de Recursos de ArcGIS. El bloqueo de esquema se parece al culpable.

    
respondido por el WolfOdrade 31.10.2012 - 17:48

Lea otras preguntas en las etiquetas