Версия 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)
Комментариев нет:
Отправить комментарий