Почему выполнение скриптов PyMongo занимает минимум 500 мс? - PullRequest
0 голосов
/ 16 октября 2018

Этот тривиальный сценарий test.py всегда выполняется более 500 мсек:

import pymongo
pymongo.MongoClient(host='127.0.0.1')

Примерно так:

lanroth@ubuntu:~$ time python3 ./test.py 
real    0m0.608s
user    0m0.096s
sys     0m0.012s

Я пробовал это на разных машинах Linux с Ubunutu 16.04, Монетный двор 19, Монго в контейнере Docker, или голый металл.Сценарий всегда занимает более 500 мс и обычно от 580 мс до 650 мс.

Задержка, по-видимому, возникает при выходе из сценария, поэтому я предполагаю, что во время очистки соединений что-то происходит по истечении 500 мс.

Выполнение следующей команды оболочки time echo 'show dbs' | mongo занимает около 8 мс, поэтому я вполне уверен, что это связано с PyMongo, а не с MongoDB.

1 Ответ

0 голосов
/ 16 октября 2018

MongoClient инициализирует PeriodicExecutor в __init__:

executor = periodic_executor.PeriodicExecutor(
    interval=common.KILL_CURSOR_FREQUENCY,
    min_interval=0.5,
    target=target,
    name="pymongo_kill_cursors_thread")

Как видите, min_interval составляет 0,5 секунды.Согласно методу PeriodicExecutor._run, поток будет спать не менее 0,5 секунд:

def _run(self):
    while not self.__should_stop():
        try:
            if not self._target():
                self._stopped = True
                break
        except:
            with self._lock:
                self._stopped = True
                self._thread_will_exit = True

            raise

        deadline = _time() + self._interval

        while not self._stopped and _time() < deadline:
            time.sleep(self._min_interval)
            if self._event:
                break  # Early wake.

        self._event = False

Изменение 0,5 до 0,1 непосредственно в коде сокращает время с 0,6 до 0,2 на моем компьютере:

(main-4hIy5yvR) ➜  main time python ./main.py
python ./main.py  0.07s user 0.02s system 15% cpu 0.596 total
(main-4hIy5yvR) ➜  main time python ./main.py
python ./main.py  0.08s user 0.02s system 49% cpu 0.203 total
...