Python 如果 mongodb 用作作业存储,则启动调度程序时 APSscheduler 包会抛出错误

Python package APSscheduler throws an error when starting scheduler if mongodb is used as a jobstore

我正在尝试 运行 使用 APScheduler MongoDB 作为作业存储的一些代码。我已经下载了 pymongo 并对其进行了测试,所以它确实有效。当我实例化调度程序时 APScheduler 将工作,但是当我 运行 scheduler.start() 它抛出以下错误:

Traceback (most recent call last):
  File "aps_ro.py", line 56, in <module>
    scheduler.start()
  File "/usr/lib/python3.8/site-packages/apscheduler/schedulers/background.py", line 33, in start
    BaseScheduler.start(self, *args, **kwargs)
  File "/usr/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 158, in start
    store.start(self, alias)
  File "/usr/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py", line 57, in start
    self.collection.ensure_index('next_run_time', sparse=True)
  File "/usr/lib/python3.8/site-packages/pymongo/collection.py", line 2028, in ensure_index
    self.__create_index(keys, kwargs, session=None)
  File "/usr/lib/python3.8/site-packages/pymongo/collection.py", line 1881, in __create_index
    with self._socket_for_writes(session) as sock_info:
  File "/usr/lib/python3.8/site-packages/pymongo/collection.py", line 195, in _socket_for_writes
    return self.__database.client._socket_for_writes(session)
  File "/usr/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1266, in _socket_for_writes
    server = self._select_server(writable_server_selector, session)
  File "/usr/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1253, in _select_server
    server = topology.select_server(server_selector)
  File "/usr/lib/python3.8/site-packages/pymongo/topology.py", line 233, in select_server
    return random.choice(self.select_servers(selector,
  File "/usr/lib/python3.8/site-packages/pymongo/topology.py", line 192, in select_servers
    server_descriptions = self._select_servers_loop(
  File "/usr/lib/python3.8/site-packages/pymongo/topology.py", line 208, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused

我的实际代码示例如下:

jobstores = {
    'mongo': {'type': 'mongodb'},
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {...}
job_defaults = {...}

scheduler = BackgroundScheduler()
scheduler.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

@scheduler.scheduled_job(trigger='cron', day_of_week=4, hour=22, minute=21, second=0)
def tester():
    print("hello")

scheduler.start()

默认情况下,mongodb python 驱动程序将连接到主机 localhost 和端口 27017 上的数据库。

因此您需要:

  • 确保 mongodb 服务器 运行 在与 python 代码相同的机器上并且是 运行,在默认端口上(您可以通过以下方式轻松测试在你最喜欢的 shell 处输入 mongo 并检查你得到 > 提示而不是错误)。
  • 如果 mongodb 在不同的服务器或不同的端口上 运行,请提供连接字符串或连接参数。