Форум сайта python.su
Как я понял ситуацию
1) словарь потокобезопасен с точки зрения чтения и записи. Это означает что при многопоточном приложении, не возникнет никаких ошибок при множественном доступе на чтение или запись (имеется ввиду с явным указанием ключа).
2) словарь не потокобезопасен с точки зрения предсказуемости результата и/или эффекта “гонки данных”. Это означает что
в коде
if param in super_dict : # дествие 1 ... что-то сделать # действие 2
Офлайн
> не возникнет никаких ошибок при множественном доступе на чтение или запись (имеется ввиду с явным указанием ключа).
Конечно же не всё так хорошо. Вот пример кода только с чтением и записью в котором будет возникать ошибки:
from threading import Thread S = {x: x*2 for x in range(1000)} def p1(): for x in range(1000): S[x*2] = x def p2(): for x in S: print(S[x]) potok1 = Thread(target=p1) potok2 = Thread(target=p2) potok2.start() potok1.start()
Офлайн
ну это не тот пример и не так ошибка. Она воспроизводится в 1 поточоном коде. Здесь же итерация по словарю который изменяфет размер. Это то о чем упоминал автор в первом посте.
сделай пример без итерации
Офлайн
Ох ты! Да тут дискуссия нарисовалась.
Спасибо всем ответившим!
Почитал про словарь с блокировками в книге. Наверное, так и буду делать.
>Конечно же не всё так хорошо. Вот пример кода только с чтением и записью в котором будет возникать ошибки:
>…
Это, всё-таки случай итераций по самому словарю (функция p2). В моём случае это было не нужно.
Офлайн
> ну это не тот пример и не так ошибка. Она воспроизводится в 1 поточоном коде
Нет. В однопоточном коде словарь не изменит своего размера во время итерации и всё будет хорошо.
> сделай пример без итерации
Не в итерации дело, а в том что если шарить изменяемое состояние между потоками, то рано или поздно начнутся проблемы. Как выход из ситуации можно использовать блокировки. Но если эти блокировки применить к моему примеру, то код фактически станет однопоточным…
Отредактировано Rodegast (Март 22, 2019 11:27:08)
Офлайн
Мда. Ты как обычно. С тобой конструктивный диалог вести вообще проблемно. Я уже говорил что как то не буду. Но видимо сам себя обманул.
Офлайн
> С тобой конструктивный диалог вести вообще проблемно.
Совершенно верно. Я обычно говорю о вполне очевидных вещах, по этому отрицать их действительно проблемно…
Офлайн
Может исопользование объекта Lock поможет?
from multiprocessing import Lock ... lock = Lock() ... lock.acquire() # что-то делаем со словарём dict или любыми другими общими данными lock.release() ...
Офлайн
GIL насколько понимаю гарантирует только, что сам Python не упадет,
а на пользовательские данные без разницы.
Офлайн
Quark
Это как по вашему будет выглядеть? Приведите пример
Офлайн