Глобальные переменные не сохраняются (два модуля плюс файл config)

Не получается передать переменную их одного модуля в другой. Одно из решений нашел - это передача переменной через сохранение в фале config.py. Но и так не получается. Эти три файла - примерное моделирование, как в моем проекте. Но результат получается точно такой же. Поэтому, решение, скорее всего, будет одинаковое.

Три файла:

Первый: first.py

import second

def search_form():
    city = 'New York'
    second.parser_fotos(city)


if __name__ == '__main__':
    search_form()

Второй: second.py

from multiprocessing.pool import Pool
import config

def parser_fotos(city):
    config.city = city
    pool_handler()

def pool_handler():
    with Pool() as pool:
        pool.map(get_person_info, range(3))
    print(config.city)

def get_person_info(lst):
    print(config.city, lst)

Третий: config.py

city = 'San Francisco'

В функции get_person_info печатает San Francisco (из config.py). А надо New York. А вот в pool_handler - New York. Но мне нужен результат в этой функции - get_person_info. Прошу помощи.


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Глобальные переменные не сохраняются, потому что они у каждого процесса свои. При старте нового процесса происходит инициализация переменных заново. Это легко можно увидеть, если добавить print("init") в config.py.

Читайте еще подробности тут

Конкретно эту проблему можно исправить передавая параметр явно, например, используя partial:

# second.py
from functools import partial
from multiprocessing.pool import Pool
import config


def parser_fotos(city):
    pool_handler(city)


def pool_handler(city):
    with Pool() as pool:
        pool.map(partial(get_person_info, city), range(3))
    print(config.city)


def get_person_info(city, lst):
    print(city, lst)

→ Ссылка