Что выведет код 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 ошибок.