セロリのロガーに問題があります。フレームをレンダリングする機能があります。生成したサブプロセスの出力をログに記録しますが、各ワーカーによってキューからピックオフされた最初のジョブのみが書き込まれているようです。キュー内の後続のすべてのタスクは、ログファイルを生成しません。Python独自のロギングも使用してみましたが、同じ問題が発生します。欠落している可能性のある構成はありますか?
@task(queue='rndr')
def rndr(params):
path = get_logger_path(params)
logger = rndr.get_logger(logfile=path)
return render(params, logger)
再試行ロガーの定義が異なるため、この方法でタスクを定義します。つまり、rndr_retry.get_logger ...
私のceleryconfigは次のようになります。
BROKER_HOST = "xxx.xxx.xxx.xxx"
BROKER_PORT = 5672
BROKER_USER = "xxxx"
BROKER_PASSWORD = "xxxx"
CELERY_RESULT_BACKEND = 'amqp'
CELERY_DISABLE_RATE_LIMITS = True
CELERY_ACKS_LATE = True
CELERY_IMPORTS = ['lib.tasks.concatenate', 'lib.tasks.encode', 'lib.tasks.render', 'lib.tasks.still_image', 'lib.tasks.retry']
CELERY_ROUTES = {'lib.tasks.encode':{'queue': 'encode'},
'lib.tasks.concatenate':{'queue': 'encode'},
'lib.tasks.still_image':{'queue': 'encode'},
'lib.tasks.render':{'queue':'rndr'},
'lib.tasks.retry':{'queue': 'retry'}
}
誰かがキューから最初のタスクだけが書き込む理由についていくつかの光を当てることができることを願っています...
前もって感謝します。
更新:要求に応じて、ここに、すべての本質的な詳細を含まないレンダリングメソッドの部分バージョンがあります...
def render(params, logger):
#load params to local values
try:
#create subprocess
output = child_proc.communicate()[0]
logger.info('output')
logger.info(output)
ret = child_proc.wait()
if ret not in [0,1]:
raise Exception('subprocess failed')
except Exception, exc:
logger.info(' '.join(str(x) for x in exc.args))
#mark as failed...
return
return
後続のタスク中にファイルが書き込まれないだけでなく、ログファイルも作成されないことを追加する必要があります。