我有一個金字塔應用程序叫mainsite
。「ResourceClosedError:交易已關閉」錯誤與芹菜拍和sqlalchemy +金字塔應用程序
該網站主要通過從視圖中啓動的線程以相當異步的方式工作來執行後端操作。
它使用sqlalchemy連接到mysql並使用ZopeTransactionExtension進行會話管理。
到目前爲止,應用程序運行良好。
我需要在其上運行定期作業,它需要使用從視圖中啓動的一些相同的異步功能。
我使用了apscheduler,但遇到了問題。所以我想將芹菜節拍作爲一個單獨的過程,將mainapp作爲一個庫來處理,並導入要使用的函數。
我芹菜的配置是這樣的:
from datetime import timedelta
from api.apiconst import RERUN_CHECK_INTERVAL, AUTOMATION_CHECK_INTERVAL, \
AUTH_DELETE_TIME
BROKER_URL = 'sqla+mysql://em:[email protected]/edgem'
CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = 'mysql://em:[email protected]/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)
將對象保存到db中。
問題是,整個事情只有約30分鐘就像寶石一樣工作。之後ResourceClosedError: The transaction is closed
錯誤開始發生在有transaction.commit()
的任何地方。我不確定是什麼問題,我需要幫助解決問題。
我在導入任務的原因是爲了擺脫這個錯誤。認爲每次需要運行任務時都需要導入,這是一個好主意,我可能每次都會得到一個新的交易,但看起來情況並非如此。
嘿。我無法爲這個人感謝你。在我想到這裏問問之前,我坐了幾天。我會試試這個,解決方案好像可能會起作用。 我會試試這個,讓你知道它是怎麼回事。 – 2013-05-03 05:27:56