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.
arcgis-desktop
arcgis-10.1
arcpy
python-addin
parallel-processing
podstawa kodu 5000
źródło
źródło
Odpowiedzi:
Przetwarzanie równoległe jest łatwiejsze „pokazane niż zrobione”. W przypadku umieszczenia tego w jednym przycisku, zgaduję dwa problemy:
Hmm szukający dalszego problemu został udokumentowany tutaj na stronie zasobów ArcGIS. Blokada schematu wygląda na sprawcę.
źródło