Использование многопроцессорной обработки со словарем, который нуждается в блокировке
Я пытаюсь использовать многопроцессорную библиотеку Python для ускорения некоторого кода. У меня есть словарь, значения которого нужно обновлять на основе результата цикла. Текущий код выглядит следующим образом:
def get_topic_count():
topics_to_counts = {}
for news in tqdm.tqdm(RawNews.objects.all().iterator()):
for topic in Topic.objects.filter(is_active=True):
if topic.name not in topics_to_counts.keys():
topics_to_counts[topic.name] = 0
if topic.name.lower() in news.content.lower():
topics_to_counts[topic.name] += 1
for key, value in topics_to_counts.items():
print(f"{key}: {value}")
Я считаю, что рабочая функция должна выглядеть следующим образом:
def get_topic_count_worker(news, topics_to_counts, lock):
for topic in Topic.objects.filter(is_active=True):
if topic.name not in topics_to_counts.keys():
lock.acquire()
topics_to_counts[topic.name] = 0
lock.release()
if topic.name.lower() in news.content.lower():
lock.acquire()
topics_to_counts[topic.name] += 1
lock.release()
Однако у меня возникли проблемы с написанием главной функции. Вот что у меня есть на данный момент, но я не знаю, как именно должны передаваться аргументы.
def get_topic_count_master():
topics_to_counts = {}
raw_news = RawNews.objects.all().iterator()
lock = multiprocessing.Lock()
with multiprocessing.Pool() as p:
Любое руководство здесь было бы признательно!
Проблема была связана с ограничением на базу данных. Многопоточность ускоряет процесс, но база данных имеет ограничение на 100 пингов за один раз. Либо увеличьте это соединение, либо максимально увеличьте количество потоков в каждый момент времени до числа меньше 100.