Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2019 13:11:22

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

потокобезопасность словаря

Здраствуйте!

Возник вопрос, можно ли пользоваться словарём, как единой удобной структурой данных в многопоточной программе?
На stackoverflow.com человек задавал подобный вопрос (https://stackoverflow.com/questions/3358770/python-dictionary-is-thread-safe), но ему нужно было одновременно итерироваться по этому словарю и изменять его. Так делать нельзя, это понятно.

Мне же нужно итерироваться по отдельному списку, но при этом читать и дозаполнять словарь (по факту, использовать этот словарь как мини-базу данных). Можно ли так поступать в многопоточной программе?

Примерно так:

 #...
from multiprocessing.dummy import Pool as ThreadPool
super_dict = {}
def fun(param):
    if param in super_dict :
        ... что-то сделать
    else:
        super_dict[param]=0
        ... ещё что-то сделать
pool = ThreadPool(20)
params = ... какие-то исходные данные
pool.map(fun, params)



Отредактировано Striver (Март 21, 2019 13:12:18)

Офлайн

#2 Март 21, 2019 13:42:59

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

потокобезопасность словаря

> можно ли пользоваться словарём, как единой удобной структурой данных в многопоточной программе?

Нельзя. Если нужны подробности, то читай книгу Марка Саммерфильда “Python на практике” стр. 253.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 21, 2019 13:45:01)

Офлайн

#3 Март 21, 2019 14:18:54

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

потокобезопасность словаря

>Нельзя.
Грустно, конечно, но спасибо за ответ.

А есть какие-нибудь структуры кроме очередей, с которыми это можно проделывать?
Или нужно обязательно внешней БД пользоваться? Если да, то, может существуют какие-то KEY-VALUE базы, работающие в памяти, которые можно было бы задействовать?



Офлайн

#4 Март 21, 2019 14:54:45

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

потокобезопасность словаря

> А есть какие-нибудь структуры кроме очередей, с которыми это можно проделывать?

Шарить изменяемые объекты между потоками само по себе не правильно, но можно сделать кастомный словарь который будет потокобезопасным. Но для этого нужно использовать блокировки, а это может помешать потокам. Про то как сделать такой словарь можно прочитать в книги про которую я написал.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 21, 2019 14:55:10)

Офлайн

#5 Март 21, 2019 16:42:55

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

потокобезопасность словаря

Striver
multiprocessing
Striver
многопоточной программе
В чем прикол? Мультипроцессинг != многопоточность.



Офлайн

#6 Март 21, 2019 17:27:35

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

потокобезопасность словаря

> В чем прикол? Мультипроцессинг != многопоточность.

Он использует multiprocessing.dummy там потоки.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Март 21, 2019 17:37:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

потокобезопасность словаря

Rodegast
Он использует multiprocessing.dummy там потоки.
Ну а при чем тогда потокобезопасность? Питон её по-любому гарантирует.



Офлайн

#8 Март 21, 2019 17:50:26

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

потокобезопасность словаря

> Питон её по-любому гарантирует.

Python её не гарантирует.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Март 21, 2019 18:10:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

потокобезопасность словаря

Rodegast
> Питон её по-любому гарантирует.Python её не гарантирует.
Ну как не гарантирует, GIL для этого и нужен, нет?



Офлайн

#10 Март 21, 2019 19:51:55

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

потокобезопасность словаря

> Ну как не гарантирует, GIL для этого и нужен, нет?

GIL не может гарантировать полностью безопасную работу со словарём. Вот тут это обсуждали:
https://stackoverflow.com/questions/1312331/using-a-global-dictionary-with-threads-in-python/32303835



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version