Python Glossary English

все 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Сообщить о неточности