为什么PyMongo脚本至少需要500毫秒才能执行?

时间:2018-10-16 12:28:09

标签: python python-3.x mongodb pymongo-3.x

这个简单的脚本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

我已在运行Docker容器中的Ubunutu 16.04,Mint 19,Mongo的其他Linux机器或裸机上尝试过此操作。该脚本通常要花费500毫秒以上的时间,通常在580毫秒至650毫秒之间。

延迟似乎在脚本退出时发生,所以我猜是在清除连接的过程中,在500毫秒后超时。

执行以下shell命令time echo 'show dbs' | mongo大约需要8毫秒,因此我很确定这与PyMongo有关,而不与MongoDB有关。

1 个答案:

答案 0 :(得分:0)

MongoClientPeriodicExecutor中初始化__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秒。根据{{​​1}}方法,线程将休眠至少0.5秒:

PeriodicExecutor._run

直接在代码中将0.5更改为0.1可以将我的机器上的时间从0.6减少到0.2:

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