ArcGIS 10.1 Python AddIn El uso de multiprocesamiento bloquea 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 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.

código base 5000
fuente
1
Si ArcMap se bloquea, póngase en contacto con su soporte de ESRI. si pueden replicarlo, reconocerán que es un error (y tal vez incluso lo arreglen algún día).
GIS-Jonathan
¿Ha instalado los 5 Service Packs para ArcGIS 10.x que ya están fuera? Tal vez eso ayude
Sergios Kolios
El OP está usando 10.1
Petr Krebs
Además, los paquetes de servicio son acumulativos, por lo que solo necesita instalar el último, no cada uno sucesivamente.
blah238
SP1 para 10.1 se lanzó esta semana.
Timothy Michael

Respuestas:

8

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:

  1. Varios subprocesos bloquean el subproceso de interfaz de usuario de ArcMap, o
  2. ArcMap coloca su propio bloqueo de esquema en la fuente de datos y no permite que el proceso de Python acceda a los datos.

Hmm buscando más problemas se ha documentado aquí en una página de recursos de ArcGIS. Schema lock parece el culpable.

WolfOdrade
fuente
No estoy seguro de si pretendía vincular algo distinto de lo que hizo (una publicación en foros de ArcGIS, no un documento oficial).
blah238
El foro es el enlace correcto. Cuando alguien encuentra más documentación oficial, puede publicarla libremente.
WolfOdrade el
Gracias por tus sugerencias. Creo que en realidad es causado por el n. ° 1. El subproceso bloquea la interfaz de usuario de ArcMap. Estoy usando una base de datos SDE, por lo que los bloqueos de esquema no son mis problemas aquí.
código base 5000