ArcGIS 10.1 Python AddIn Using Multiprocessing zawiesza ArcMap?

20

Chciałbym uruchomić zadanie wieloprocesowe z narzędzia dodatkowego do Pythona. Moim problemem jest to, że proces ciągle się nie udaje. Zasadniczo powoduje awarię ArcMap.

Oto mój podstawowy kod:

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'

Jeśli uruchomię kod poza ArcMap lub z przybornika, działa to bez problemu, ale kiedy wstawię logikę do przycisku, spowoduje to awarię arcmap.

Domyślam się, że ArcMap działa dla wszystkich dodatków do Pythona. Czy istnieje rozwiązanie tego problemu?

Próbowałem również dodać do kodu freeze_support (), ale to też nic nie dało.

podstawa kodu 5000
źródło
1
Jeśli ArcMap ulega awarii, skontaktuj się ze wsparciem ESRI. jeśli potrafią go powielić, uznają, że to błąd (a może nawet go naprawią pewnego dnia).
GIS-Jonathan
Czy zainstalowałeś już wszystkie 5 dodatków Service Pack dla ArcGIS 10.x? Może to pomoże
Sergios Kolios
OP używa 10.1
Petr Krebs
Dodatki Service Pack są kumulatywne, więc wystarczy zainstalować tylko najnowszy, a nie jeden po drugim.
blah238,
Dodatek SP1 dla wersji 10.1 został wydany w tym tygodniu.
Timothy Michael,

Odpowiedzi:

8

Przetwarzanie równoległe jest łatwiejsze „pokazane niż zrobione”. W przypadku umieszczenia tego w jednym przycisku, zgaduję dwa problemy:

  1. Wiele wątków blokuje wątek interfejsu ArcMap lub
  2. ArcMap nakłada własną blokadę schematu na źródło danych i nie zezwala na dostęp do danych przez proces Pythona.

Hmm szukający dalszego problemu został udokumentowany tutaj na stronie zasobów ArcGIS. Blokada schematu wygląda na sprawcę.

WolfOdrade
źródło
Nie jestem pewien, czy chciałeś połączyć coś innego niż to, co zrobiłeś (post na forach ArcGIS, a nie oficjalny dokument).
blah238
Forum to poprawny link. Gdy ktoś znajdzie bardziej oficjalną dokumentację, może ją opublikować.
WolfOdrade
Dziękuję za twoje sugestie. Uważam, że jest to spowodowane przez numer 1. Blokuje wątki dla interfejsu ArcMap. Używam bazy danych SDE, więc blokady schematów nie są tutaj moimi problemami.
podstawa kodu 5000