Что является и не является автоматически локальным для потоков в Python Threading?
Мне трудно сосредоточиться на потоке Python, тем более что документация явно говорит вам о RTFS в некоторых моментах, вместо того, чтобы любезно включать соответствующую информацию. Я признаю, что не чувствую себя способным читать модуль потоков. Я видел много простых примеров, но все они используют глобальные переменные, что оскорбительно и заставляет меня задуматься, знает ли кто-нибудь, когда или где требуется их использовать, а не просто удобно.
В частности, я хотел бы знать:
- В
threading.Thread(target=x)
, являетсяx
общий или частный? Каждый поток имеет свой собственный стек или все потоки используют один и тот же контекст одновременно? - Каков предпочтительный способ передачи изменяемых переменных в потоки? Неизменные, очевидно, через
Thread(args=[],kwargs={})
и это то, что охватывают все примеры. Если это глобально, мне придется держать нос и использовать его, но, похоже, должен быть лучший способ. Я полагаю, я мог бы обернуть все в классе и просто передать экземпляр, но было бы неплохо также указать на обычные переменные. - Когда мне нужно
threading.local()
? вx
выше? - Нужно ли создавать подкласс Thread для обновления данных, как показывают многие примеры?
Я привык к потокам Win32 и pthreads, где в документах это явно изложено, что является и не используется для различных видов использования потоков. Это довольно низкоуровневые, и я бы хотел избежать, если это возможно, питона.
Я не уверен, что это актуально, но я пытаюсь создать поток в стиле OpenMP, чтобы освоить его - заставить цикл for выполняться одновременно с использованием очереди и некоторых потоков. Это было легко с глобалами и замками, но теперь я хотел бы прибить прицелы для лучшего использования замков.
1 ответ
В потоке.Thread(target=x), является общим или частным x?
Это личное. Каждый поток имеет свой собственный частный вызов x
,
Это похоже на рекурсию, например (независимо от многопоточности). Если x
называет себя, каждый вызов x
получает свой собственный "приватный" фрейм с собственными приватными локальными переменными.
Каков предпочтительный способ передачи изменяемых переменных в потоки? Нужно ли создавать подкласс Thread для обновления данных?
Я смотрю target
аргумент в качестве быстрого ярлыка, хорошо для быстрых экспериментов, но не более того. Использование его там, где его не следует использовать, приводит ко всем ограничениям, которые вы описываете в своем вопросе (и к хакерам, которые вы описываете в возможных решениях, которые вы рассматриваете).
Большую часть времени вы хотите подкласс threading.Thread
, Код, создающий / управляющий потоками, передает все изменяемые общие объекты вашим классам потоков. __init__
и они должны сохранять эти объекты в качестве своих атрибутов и получать к ним доступ при запуске (в пределах своих run
метод).
Когда мне нужен threading.local()?
Вы редко делаете, так что вы, вероятно, нет.
Я хотел бы избежать _thread, если это возможно, чтобы быть pythonic
Без сомнения, избегайте этого.