Форум сайта python.su
Здраствуйте!
Возник вопрос, можно ли пользоваться словарём, как единой удобной структурой данных в многопоточной программе?
На 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)
Офлайн
> можно ли пользоваться словарём, как единой удобной структурой данных в многопоточной программе?
Нельзя. Если нужны подробности, то читай книгу Марка Саммерфильда “Python на практике” стр. 253.
Отредактировано Rodegast (Март 21, 2019 13:45:01)
Офлайн
>Нельзя.
Грустно, конечно, но спасибо за ответ.
А есть какие-нибудь структуры кроме очередей, с которыми это можно проделывать?
Или нужно обязательно внешней БД пользоваться? Если да, то, может существуют какие-то KEY-VALUE базы, работающие в памяти, которые можно было бы задействовать?
Офлайн
> А есть какие-нибудь структуры кроме очередей, с которыми это можно проделывать?
Шарить изменяемые объекты между потоками само по себе не правильно, но можно сделать кастомный словарь который будет потокобезопасным. Но для этого нужно использовать блокировки, а это может помешать потокам. Про то как сделать такой словарь можно прочитать в книги про которую я написал.
Отредактировано Rodegast (Март 21, 2019 14:55:10)
Офлайн
Striver
multiprocessing
StriverВ чем прикол? Мультипроцессинг != многопоточность.
многопоточной программе
Офлайн
> В чем прикол? Мультипроцессинг != многопоточность.
Он использует multiprocessing.dummy там потоки.
Офлайн
RodegastНу а при чем тогда потокобезопасность? Питон её по-любому гарантирует.
Он использует multiprocessing.dummy там потоки.
Офлайн
> Питон её по-любому гарантирует.
Python её не гарантирует.
Офлайн
RodegastНу как не гарантирует, GIL для этого и нужен, нет?
> Питон её по-любому гарантирует.Python её не гарантирует.
Офлайн
> Ну как не гарантирует, GIL для этого и нужен, нет?
GIL не может гарантировать полностью безопасную работу со словарём. Вот тут это обсуждали:
https://stackoverflow.com/questions/1312331/using-a-global-dictionary-with-threads-in-python/32303835
Офлайн