LINUX.ORG.RU

функции писать в разные переменные

 


0

1

питон. есть функция, её вызывают разные потоки. не могу придумать, как бы сделать так, чтоб в зависимости от потока функция писала вывод в разные глобальные переменные. как передать имя переменной в параметрах? есть ли какой-то «маппинг» чтоб сассоциировать глобальную переменную локальной?

в принципе можно наплодить количество функций равных количеству потоков, или внутри функции перед каждым действием все проверять по if, но хочется более элегантного решения.

★★★

Ответ на: комментарий от vvn_black

этот тред и рожден идеей уйти от внешнего хранилища, а использовать просто несколько словарей как глобальные переменные. и что в этом плохого?

flant ★★★
() автор топика
Ответ на: комментарий от flant

Ну потому что треды и глобальные переменные это жёсткий антипаттерн с очень редкими исключениями (очереди, семафоры, локи). Вот ты знаешь в какой момент у тебя gil поток переключит? Занёс переменную, сел файл читать, гил ушёл, другой поток в ту же переменную что-то записал. В итоге стейт абсолютно непредсказуем. И тут ещё спасибо что гил есть, иначе можно было б в два потока один лонг писать, первый пишет одну половину, а второй - другую.

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

этот тред и рожден идеей уйти от внешнего хранилища, а использовать просто несколько словарей как глобальные переменные. и что в этом плохого?

Стейт сложно воспроизвести для тестов, ну и нужно раз в 10 осторожнее быть и четко обозначать места где ты туда обращаешься. Лучше посмотри в сторону diskcache тогда или кешей из functools, и не забудь провести тестирование на 100500 потоков что нигде ничего не лопнет пока ты кеш читаешь.

upcFrost ★★★★★
()

как бы сделать так, чтоб в зависимости от потока функция писала вывод в разные глобальные переменные

Не использовать глобальные переменные

Aswed ★★★★★
()