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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.