Зависание при выполнении функции, если соединение с Интернетом потеряно - PullRequest
1 голос
/ 21 апреля 2019
from arcgis.gis import GIS
from IPython.display import display
gis = GIS("portal url", 'username', 'password')

#search for the feature layer named Ports along west coast
search_result = gis.content.search('title:Ports along west coast')

#access the item's feature layers
ports_item = search_result[0]
ports_layers = ports_item.layers

#query all the features and display it on a map
ports_fset = ports_layers[0].query() #an empty query string will return all 
ports_flayer = ports_layers[0]
ports_features = ports_fset.features

# select San Francisco feature
sfo_feature = [f for f in ports_features if f.attributes['port_name']=='SAN FRANCISCO'][0]
sfo_feature.attributes
try:
    update_result = ports_flayer.edit_features(updates=[sfo_edit])
except:
    pass

Это пример, который я показал, в котором я пытаюсь обновить векторный слой.На самом деле я обновляю записи в цикле, поэтому есть много записей.Проблема в том случае, если «Интернет-соединение» только что сбито. Оно застряло в функции edit_features.

Так что нет никакого способа, которым можно было бы пойти, кроме как и продолжить поток.

Мне просто нужно нажать Ctrl + C, чтобы остановить выполнение скрипта, потому что он завис и функция edit_features ().Что я могу сделать?

1 Ответ

2 голосов
/ 22 апреля 2019

Если я в вашей ситуации, я буду искать arcgis API документы для установки тайм-аута соединения, если вы не можете найти ни одного, я предлагаю:

  1. использовать модуль потоков для запуска функции обновления в отдельном потоке, это неэффективный способ, но в случае, если он застрянет, вы можете продолжить выполнение оставшегося кода.
  2. используйте библиотеку запросов Python для проверки любого веб-сайта, а перед обновлением проверяйте код ответа.

код для многопоточности будет выглядеть так:

from threading import Thread
from time import sleep

def update():
    global update_result
    update_result = ports_flayer.edit_features(updates=[sfo_edit])

try:
    update_result = None
    t1 = Thread(target=update)
    t1.daemon = True  # mark our thread as a daemon
    t1.start()
    sleep(10)  # wait 10 seconds then timeout, adjust according to your needs
    if update_result == None:
        print('failed to update')
except Exception as e:
    print(e)
...