【发布时间】:2013-04-26 15:53:19
【问题描述】:
我有一个名为 mainsite 的金字塔应用程序。
网站以相当异步的方式工作,主要是通过从视图启动线程来执行后端操作。
它使用 sqlalchemy 连接到 mysql,并使用 ZopeTransactionExtension 进行会话管理。
到目前为止,该应用程序运行良好。
我需要在其上运行定期作业,并且它需要使用一些从视图启动的相同异步函数。
我使用了 apscheduler,但遇到了问题。于是想到了用celery beat作为一个单独的进程,把mainapp当作一个库,导入要使用的函数。
我的 celery 配置如下所示:
from datetime import timedelta
from api.apiconst import RERUN_CHECK_INTERVAL, AUTOMATION_CHECK_INTERVAL, \
AUTH_DELETE_TIME
BROKER_URL = 'sqla+mysql://em:em@localhost/edgem'
CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = 'mysql://em:em@localhost/edgem'
CELERYBEAT_SCHEDULE = {
'rerun': {
'task': 'tasks.rerun_scheduler',
'schedule': timedelta(seconds=RERUN_CHECK_INTERVAL)
},
'automate': {
'task': 'tasks.automation_scheduler',
'schedule': timedelta(seconds=20)
},
'remove-tokens': {
'task': 'tasks.token_remover_scheduler',
'schedule': timedelta(seconds=2 * 24 * 3600 )
},
}
CELERY_TIMEZONE = 'UTC'
tasks.py 是
from celery import Celery
celery = Celery('tasks')
celery.config_from_object('celeryconfig')
@celery.task
def rerun_scheduler():
from mainsite.task import check_update_rerun_tasks
check_update_rerun_tasks()
@celery.task
def automation_scheduler():
from mainsite.task import automate
automate()
@celery.task
def token_remover_scheduler():
from mainsite.auth_service import delete_old_tokens
delete_old_tokens()
请记住,上述所有函数都会立即返回,但如果需要则启动线程
线程通过 transaction.commit() after session.add(object) 将对象保存到数据库中。
问题是整个事情像宝石一样只工作大约 30 分钟。之后ResourceClosedError: The transaction is closed 错误开始发生在有transaction.commit() 的地方。我不确定是什么问题,我需要帮助进行故障排除。
我在任务中导入的原因是为了摆脱这个错误。认为每次需要运行任务时都导入是个好主意,而且我可能每次都会得到一个新事务,但看起来情况并非如此。
【问题讨论】:
标签: sqlalchemy celery pyramid