Что является и не является автоматически локальным для потоков в 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

Без сомнения, избегайте этого.

Другие вопросы по тегам