Что выведет код Middle GIL, потоки и процессы обновлено

Счётчик под блокировкой в потоках

Вопрос

Что выведет код? По строке на каждый print.

import threading

counter = 0
lock = threading.Lock()

def work():
    global counter
    for _ in range(10000):
        with lock:
            counter += 1

threads = [threading.Thread(target=work) for _ in range(4)]
for t in threads:
    t.start()
for t in threads:
    t.join()
print(counter)

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 40000. Блокировка делает чтение, сложение и запись неделимыми относительно других потоков, а join дожидается всех потоков перед печатью.

Что выведет

40000

Разбор

Блокировка делает чтение, сложение и запись неделимыми относительно других потоков, а join дожидается всех потоков перед печатью. Результат всегда 40000. Без with lock результат на конкретной версии мог бы совпасть, но гарантии нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.