все Python 3threadingпонятие
threading.local
потоки
Хранилище, у которого в каждом потоке свой набор атрибутов: записанное одним потоком другие не видят. Например, своё соединение с БД на поток.
Синтаксис
data = threading.local()
data.attr = value # видно только в этом потоке
Атрибут, присвоенный в главном потоке, в других просто отсутствует — AttributeError, а не общее значение. Чтобы у каждого потока было начальное значение, наследуйтесь от threading.local и задайте его в __init__: он вызовется заново в каждом потоке при первом обращении. Объект создают один раз и делят между потоками, а не заводят внутри функции. В пуле потоков данные переживают задачу — следующая задача в том же потоке их увидит. Для asyncio нужен contextvars: все корутины там живут в одном потоке.
Примеры
import threading
data = threading.local()
data.name = 'main'
seen = []
def worker():
seen.append(hasattr(data, 'name'))
data.name = 'worker'
t = threading.Thread(target=worker)
t.start()
t.join()
print(seen, data.name) # → [False] main
import threading
class Counter(threading.local):
def __init__(self):
self.n = 0
counter = Counter()
results = []
def work(k):
for _ in range(k):
counter.n += 1
results.append(counter.n)
threads = [threading.Thread(target=work, args=(k,)) for k in (1, 2, 3)]
for t in threads:
t.start()
for t in threads:
t.join()
print(sorted(results), counter.n) # → [1, 2, 3] 0
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности