MongoDB M0 кластер, многопоточность Python - PullRequest
1 голос
/ 17 октября 2019

У меня есть приложение на python, которое просматривает и использует базу данных mongo для ведения записей. На некоторых этапах выполнения происходит большое количество запросов на вход и выход. Когда это происходит, сервер закрывает мои запросы и выдает следующую ошибку в кластере:

Connections % of configured limit has gone above 80

Каков наилучший способ использования pymongo с потоками? Я полагал, что mongodb других DMBS будет автоматически обрабатывать планирование одновременных запросов. Нужно ли просто создавать локальный кластер или модернизировать текущий до большего количества подключений?

1 Ответ

0 голосов
/ 17 октября 2019

Типичным действием в этом случае является создание входной очереди. Задайте очередь и поместите в нее задачи, а также создайте несколько рабочих, которые будут брать задачи из очереди. Если вам нужно ограничить число работников, которые могут получить доступ к ресурсам, одновременно используйте многопоточность. Семафор или многопоточность. Блокировка Надеюсь, что ответ будет вам полезен, не стесняйтесь задавать вопросы.

import threading as thr
from queue import Queue


def work(input_q):
    """the function take task from input_q and print or return with some code changes (if you want)"""
    while True:
        item = input_q.get()
        if item == "STOP":
            break

        # else do some work here
        print("some result")


if __name__ == "__main__":
    input_q = Queue()
    urls = [...]
    threads_number = 8 # experiment with the number of workers
    workers = [thr.Thread(target=work, args=(input_q,),) for i in range(threads_number)]
    # start workers here
    for w in workers:
        w.start

    # start delivering tasks to workers 
    for task in urls:
        input_q.put(task)

    # "poison pillow" for all workers to stop them:

    for i in range(threads_number):
        input_q.put("STOP")

    # join all workers to main thread here:

    for w in workers:
        w.join

    # show that main thread can continue

    print("Job is done.")
...