Использование многопроцессорной обработки со словарем, который нуждается в блокировке

Я пытаюсь использовать многопроцессорную библиотеку 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.

Вернуться на верх