Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

Синхронизация потоков при наращивании count += 1 глобальной переменной

Версия Python 3.5, использую модуль threading. Нужна ли синхронизация, когда потоки изменяют общую глобальную переменную в один момент времени? В книгах пишут, что нужно использовать Lock(), но и без него не возникает не каких проблем. Пример кода из книги:
import threading, time
count = 0
def adder(): global count count += 1 time.sleep(0.5) count += 1
threads = [] for i in range(100): thread = threading.Thread(target=adder, args=()) thread.start() threads.append(thread)
for thread in threads: thread.join()
print(count)
Вот здесь, судя по книге, должно каждый раз выдавать разные числа, так как одновременно 100 потоков в один момент времени меняют переменную count. Но почему-то всё нормально срабатывает. Это в какой-то версии было исправлено или как? Объясните, кто знает.


Ответ

Атомарные операции.
Переключение нитей происходит только между отдельными байт-код операциями. Сами же операции неделимы. Посмотреть, как выглядит байт-код можно с помощью модуля dis
Вот некоторые потокобезопасные операции:
чтение или изменение одного атрибута объекта чтение или изменение одной глобальной переменной выборка элемента из списка модификация списка "на месте" (т.е. с помощью метода append) выборка элемента из словаря модификация словаря "на месте" (т.е. добавление элемента, или вызов метода clear)

Комментариев нет:

Отправить комментарий