Работа двух потоков при обращении к одному элементу
У меня есть программа задача которой добавлять и удалять значения из словаря. Изначально программа работала в один поток и две функции выполнялись последовательно, но я хотел увеличить скорость обработки и разделить выполнение на 2 потока. Программа работает корректно до того момента, когда нужно удалить или добавить элемент в словарь, после добавления/удаления обязательно отключается один из потоков. Чтение словаря проходит без остановок потоков. Пробовал применять Lock, но эффекта не дало, наверное что-то не так сделал. Подскажите как сделать так чтобы потоки не отключались?
main_dict = {}
def main_open():
# Результатом работы этой функции является добавление нового элемента в словарь
main_dict[clue1] = value
def main_close():
# Результатом работы этой функции является удаление элемента из словаря
del main_dict[clue2]
main_open = threading.Thread(target=main_open)
main_close = threading.Thread(target=main_close)
main_open.start()
main_close.start()
Ответы (2 шт):
Обращаться к одному и тому же объекту в потоках не очень правильно, поскольку начинается конкуренция. Лучше создать отдельный словарь для функции добавления и отдельный для функции удаления, затем запустить потоки по этим двум словарям и по завершению всех потоков просто соединить словари.
- Вы забыли после
start()сделатьjoin(), таким образом вы бросаете потоки на произвол судьбы, а не ждёте их завершения - Что касается добавления и удаления элементов, словарь в
Pythonпотокобезопасен, пока вы не пытаетесь по нему итерироваться Lockпрекрасно работает, если вам нужно обеспечить атомарность неких связанных операций, проблема скорее всего у вас в чём-то другом (в том, что вы итерируетесь по элементам словаря, который используете в нескольких потоках?)
В общем, нужно больше сведений о том, что ещё делает ваш код, чтобы можно было понять, в чём же проблема.
Возможно, вам вообще нужен для вашей задачи не словарь, а, например, очередь deque.