というピラミッドアプリがありmainsite
ます。
このサイトは、ほとんどの場合、バックエンド操作を実行するためにビューから起動されるスレッドを通じて、かなり非同期で動作します。
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: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()
上記のすべての関数はすぐに戻りますが、必要に応じてスレッドを起動することに注意してください
スレッドは、オブジェクトを db に保存しますtransaction.commit() after session.add(object)
。
問題は、全体が宝石のように機能するのが約 30 分間だけであることです。その後、.ResourceClosedError: The transaction is closed
がある場所ならどこでもエラーが発生し始めtransaction.commit()
ます。何が問題なのかわからないので、トラブルシューティングのサポートが必要です。
タスク内にインポートする理由は、このエラーを取り除くためです。タスクを実行する必要があるたびにインポートするのは良い考えであり、毎回新しいトランザクションを取得する可能性がありますが、そうではないようです。