【问题标题】:Why do I have 2 SQLAlchemy connections when pool_size is set to 1?当 pool_size 设置为 1 时,为什么我有 2 个 SQLAlchemy 连接?
【发布时间】:2022-01-31 10:29:52
【问题描述】:

您好,我有一个电报机器人连接到 MySQL 数据库。我正在使用 PythonAnywhere 的免费帐户,它允许我每个用户最多有 3 个到 db 的连接。但是我收到了max_user_connections 错误,所以我已经像这样配置了我的 SQLAlchemy 引擎:

engine = create_engine(db_url, echo=False, echo_pool=True, pool_size=1, pool_recycle=1200)

我的印象是,使用pool_size=1,将只有一个与 db 的连接。但是有2个!你能帮我理解为什么会这样吗?

这是SHOW PROCESSLIST 向我展示的内容:

第一个是我用来检查进程列表的控制台。但接下来的两个是在机器人工作时创建的。

我还添加了max_overflow=0 只是为了测试,但这也没有任何区别。

【问题讨论】:

  • 你是如何运行你的电报机器人的;可能有多个实例正在运行?

标签: python mysql sqlalchemy python-telegram-bot pythonanywhere


【解决方案1】:

PythonAnywhere 开发人员在这里——我认为问题在于您在模块级别(即在您的视图函数之外)调用create_engine。当你的应用程序启动时,它会在你的模块中运行代码,然后分叉出工作进程——所以如果你在一个函数之外调用 create_engine ,那将在那个时候创建​​一个连接,然后另一个将被创建你的工作进程需要一个。

一般来说,我建议不要从外部视图调用create_engine

【讨论】:

    【解决方案2】:

    我能想到的与python-telegram-bot 的唯一连接是线程。 PTB 使用以下线程:

    • 你调用updater.start_polling/webhook()updater.idle()的主线程
    • 一个用于获取更新的线程(由updater.start_polling/webhook() 开始)
    • 一个处理更新的线程(由Dispatcher.start启动,调用dispatcher.process_update
    • run_async 处理程序的工作线程 - 默认情况下是 4 个工作人员,可以通过 workersUpdater/Dispatcher 参数自定义
    • JobQueue 中的每个作业都有 1 个线程

    如果在每个线程中都创建了一个新连接,那么您可能需要考虑在哪里调用create_engine 左右。


    免责声明:我目前是python-telegram-bot的维护者

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多