Найти - Пользователи
Полная версия: потокобезопасность словаря
Начало » Python для экспертов » потокобезопасность словаря
1 2 3
Striver
Здраствуйте!

Возник вопрос, можно ли пользоваться словарём, как единой удобной структурой данных в многопоточной программе?
На 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)

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

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

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

Шарить изменяемые объекты между потоками само по себе не правильно, но можно сделать кастомный словарь который будет потокобезопасным. Но для этого нужно использовать блокировки, а это может помешать потокам. Про то как сделать такой словарь можно прочитать в книги про которую я написал.
FishHook
Striver
multiprocessing
Striver
многопоточной программе
В чем прикол? Мультипроцессинг != многопоточность.
Rodegast
> В чем прикол? Мультипроцессинг != многопоточность.

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

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

GIL не может гарантировать полностью безопасную работу со словарём. Вот тут это обсуждали:
https://stackoverflow.com/questions/1312331/using-a-global-dictionary-with-threads-in-python/32303835
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB