【发布时间】:2021-02-06 16:05:56
【问题描述】:
在我目前正在进行的项目中,我不允许使用 ORM,所以我创建了my own
效果很好,但我在使用 Celery 时遇到了问题,而且它是并发的。有一段时间,我将其设置为1(使用--concurrency=1),但我添加了new tasks,这需要比使用celery beat 运行更多的时间来处理,这会导致大量任务积压。
当我将 celery 的并发设置为 > 1 时,会发生以下情况(pastebin,因为它很大):
关于如何在其他进程上实现某种锁定/等待以使不同的工作人员不会相互交叉的任何想法?
编辑:这里是我设置PyMySQL instance 的地方以及open and close are handled 的设置方式
【问题讨论】:
-
嗯,他们应该这样做,但似乎他们同时这样做,或者在我设置 PyMySQL 的方式上有些东西我不明白
-
我在代码中看到了这个:
database_uri=f"sqlite:///{BACKEND_ROOT}/../chatbot_database.sqlite3", -
看起来数据库连接只在 Flask 应用程序中完成。我不知道 Celery 任务是否可以使用它。最好的办法是获取这些连接详细信息,并在任务中打开数据库会话,执行 DML 并关闭它。我相信 Flask 用户会知道问题所在......
-
您看到的内容与其他内容相关联,而不是错误的一部分。这是一个本地 sqlite 数据库,不被烧瓶使用,而只被 celery 使用,不会导致错误。当多个线程尝试同时读取/写入数据库时会导致该错误
-
您有两个工作人员,他们使用相同的网络连接,这将永远无法正常工作,因此每个实例都需要自己的
标签: python mysql flask celery pymysql