LINUX.ORG.RU

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

 


0

1

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

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

★★

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

разные потоки

Разупорись. Но если очень хочешь - есть метод globals, вернёт словарь, дальше по имени забираешь

upcFrost ★★★★★ ()

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

Как-то совсем некрасиво с глобальными переменными и потоками.

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

Очередь, сигналы, данные. Не так сложно, если завернуть в объект - ещё и читаемо

Shadow ★★★★★ ()
Последнее исправление: Shadow (всего исправлений: 1 )

более элегантного решения

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

slovazap ★★★★★ ()

std::thread_local. Ах да, у тебя же петон. Ну если у потока можно попросить его id, то словарь, где ключ это id потока. Но вообще у петона нет многопоточности, так что это всё бесполезно.

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

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

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

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

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

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

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

upcFrost ★★★★★ ()
def funktsia(peremennaya):
    peremennaya.add('a v chem problemа-to?')

А в чём проблема-то?

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

Но вообще у петона нет многопоточности, так что это всё бесполезно.

Есть многопоточность. GIL никак не мешает IO-bound задачам выполняться в несколько потоков.

eternal_sorrow ★★★★★ ()

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

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

Aswed ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.