0

セロリのロガーに問題があります。フレームをレンダリングする機能があります。生成したサブプロセスの出力をログに記録しますが、各ワーカーによってキューからピックオフされた最初のジョブのみが書き込まれているようです。キュー内の後続のすべてのタスクは、ログファイルを生成しません。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

後続のタスク中にファイルが書き込まれないだけでなく、ログファイルも作成されないことを追加する必要があります。

4

1 に答える 1

5

何度か試したところ、渡されたログファイルが作成されていなかったことがわかりました。get_logger()に渡す前に、ファイルが存在することを確認するメソッドを追加しました。まだ運がない。ほとんどのタスクはサブプロセスを実行するため、より単純なアプローチを取り、ファイルオブジェクトを開いて、それをstdoutとstderrのサブプロセス呼び出しに渡し、必要に応じてファイルオブジェクトを閉じることにしました。これは、実行するタスクの数に関係なく機能するようです。各タスクが一意のファイルに書き込むことに注意する必要があります。

とにかく、私はセロリの開発者に手紙を書いて、それをバグとしてマークすると思います。私はどこかの開発フォーラムのどこかで、セロリのロガーが何らかの愛を必要としていることを読んだことがあります。

乾杯。

アップデート:

セロリの開発者と話をした後、ロガーはこのように使用されることを意図していないと結論付けられました。ロギングのインスタンスはタスクに対して開始されますが、繰り返されるタスクはログに記録されません。ロギングモジュールの問題を回避するために、ファイルに書き込むだけで済みました。各レンダリングタスクは一意のファイルを使用するため、トリックを実行し、衝突を引き起こしません。

于 2012-06-20T20:37:28.467 に答える