После использования @ray decorator не может добавлять данные в словарь - PullRequest
0 голосов
/ 25 апреля 2019

Я написал функцию, которая получает некоторые данные из API и возвращает их в словарь. Когда я выполнил это работает нормально. Проблема в том, что я пытаюсь выполнить эту функцию дважды в одно и то же время, используя библиотеку лучей. Данные корректно поступают из API, но не добавляются в словарь.

Companies = dict()

def call_company_api(company_id, dictionary):
    data = requests.get(API_CALL_COMPANY_URL.format(company_id)).json()
    # name = data['data']['krs_podmioty.nazwa'] FULL NAME
    name = data['data']['krs_podmioty.nazwa_skrocona']
    city = data['data']['krs_podmioty.adres_poczta']
    nip = data['data']['krs_podmioty.nip']
    community_id = data['data']['krs_podmioty.gmina_id']
    county_id = data['data']['krs_podmioty.powiat_id']
    voivodeship_id = data['data']['krs_podmioty.wojewodztwo_id']

    try:
        community = gminy_list[community_id]
        county = powiaty_list[county_id]
        voivodeship = wojewodztwa_list[voivodeship_id]

    except KeyError:
        community = community_id
        county = county_id
        voivodeship = voivodeship_id

    dictionary[name] = [city, county, community , voivodeship, nip]

когда я выполняю этот код ниже, работает нормально


def call_company():
    for k in comapanies_list:
        call_company_api(k, Companies)

call_company()


print(Companies) --> {'BELKA19': ['Warszawa', 'Warszawa', 'Warszawa', 'Mazowieckie', '5252786971'], 'GSW CONSTRUCTION': ['Kraków', 'Kraków', 'Kraków', 'Małopolskie', '6762564804']}


В этом случае данные не добавляются в словарь, знаете, как это исправить? Я попытался добавить отдельные словари для всех функций call_items, но это также не работает должным образом, как я ожидал.


ray.init()



@ray.remote
def call_l1_items():
    for k in l1:
        call_company_api(k, Companies)



@ray.remote
def call_l2_items():
    for k in l2:
        call_company_api(k, Companies)



ret_id1 = call_l1_items.remote()
ret_id2 = call_l2_items.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])

print(Companies) --> {}

1 Ответ

1 голос
/ 25 апреля 2019

Проблема в том, что задачи Ray выполняются в отдельных процессах (в отличие от потоков), поэтому при определении функции call_l1_items, которая использует словарь Companies, создается копия словаря Companies врабочие процессы, которые фактически выполняют задачу.Таким образом, удаленная копия словаря будет видоизменена, но не оригинальная копия в вашем основном скрипте.

Это можно исправить, вернув элементы из функции, а затем обновив исходный словарь в основном скрипте.

...