ArcGIS 10.1 Python AddIn Using Multiprocessing trava o ArcMap?

20

Gostaria de executar uma tarefa de multiprocessamento a partir de uma ferramenta de suplemento python. Meu problema é que o processo continua falhando. Basicamente trava o ArcMap.

Aqui está o meu 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'

Se eu executar o código fora do ArcMap ou de uma caixa de ferramentas, ele funcionará sem problemas, mas quando coloco a lógica dentro de um botão, ele causa uma falha no arcmap.

Meu palpite é que o ArcMap está sendo executado em processo para todos os suplementos de python. Existe uma solução alternativa para esse problema?

Eu tentei adicionar o freeze_support () ao código também, mas isso também não fez nada.

base de código 5000
fonte
1
Se o ArcMap estiver falhando, entre em contato com o suporte da ESRI. se eles puderem replicá-lo, reconhecerão que é um bug (e talvez até o conserte um dia).
GIS-Jonathan
Você instalou todos os 5 Service Packs para ArcGIS 10.x que já estão disponíveis? Talvez isso vai ajudá
Sergios Kolios
O OP está usando 10.1
Petr Krebs
Além disso, os service packs são cumulativos; portanto, você só precisa instalar o mais recente, não cada um em sucessão.
precisa saber é o seguinte
O SP1 para 10.1 foi lançado esta semana.
Timothy Michael

Respostas:

8

O processamento paralelo é mais fácil 'mostrado do que feito'. No caso de colocar tudo isso em um botão, estou supondo dois problemas:

  1. Vários threads bloqueiam o thread da interface do usuário do ArcMap ou
  2. O ArcMap coloca seu próprio bloqueio de esquema na fonte de dados e não permite que o processo python acesse os dados.

Hmm, procurando um problema adicional foi documentado aqui em uma página de Recursos do ArcGIS. O bloqueio do esquema se parece com o culpado.

WolfOdrade
fonte
Não tenho certeza se você pretendia vincular algo diferente do que você fez (uma postagem nos fóruns do ArcGIS, não um documento oficial).
blah238
O fórum é o link correto. Quando alguém encontra mais documentação oficial, pode ficar à vontade para publicá-la.
WolfOdrade
Obrigado por suas sugestões. Eu acredito que é realmente causado pelo # 1. Os blocos de encadeamento para a interface do usuário do ArcMap. Como uso um banco de dados SDE, os bloqueios de esquema não são meus problemas aqui.
código base 5000