1

これはおそらくキャプテンの明らかなスタイルの質問ですが、何かが足りないような気がします。

Celeryタスクを作成するPythonWSGIアプリを継承しました。これは次のようになります。

#web.py

from bottle import route, run, request, response, abort
import bottle
from project.tasks import process_request

@route('/')
def web():
    url = request.query_string
    process_request.delay(
        url=url,
        path=request.path,
        query=request.query_string,
        cookies=dict(request.cookies),
        headers=dict(request.headers),
        remote_addr=request.remote_addr,
    )

メソッドは次のprocess_requestようになります。

#tasks.py
@celery.task
def process_request(url, path, query, cookies, headers, remote_addr):
    #does some stuff

上記のすべてが機能します。process_requestにタイムスタンプを追加しようとしたので、呼び出しは次のようになります。

#web.py

#imports from above
from datetime import datetime

@route('/')
def web():
    url = request.query_string
    process_request.delay(
        url=url,
        path=request.path,
        query=request.query_string,
        cookies=dict(request.cookies),
        headers=dict(request.headers),
        remote_addr=request.remote_addr,
        s_time=str(datetime.now())
    )

そして、process_requestメソッドを次のように変更しました。

#tasks.py
@celery.task
def process_request(url, path, query, cookies, headers, remote_addr, s_time):
    #does some stuff

それはうまくいきませんでした。リクエストは処理されていませんでした。celerydログファイルを確認したところ、次のことがわかりました。

[2013-03-26 16:19:03,330: ERROR/MainProcess] Task beacon.tasks.process_request[235f9fa8-1f10-4ee0-a1f9-e389021ea0ad] raised exception: TypeError('process_request() takes exactly 7 non-keyword arguments (6 given)',)
Traceback (most recent call last):
  File "/home/beacon/.virtualenvs/beacon/lib/python2.6/site-packages/celery/task/trace.py", line 228, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/beacon/.virtualenvs/beacon/lib/python2.6/site-packages/celery/task/trace.py", line 415, in __protected_call__
    return self.run(*args, **kwargs)
TypeError: process_request() takes exactly 7 non-keyword arguments (6 given)

何が間違っているのかわかりません。誰かアイデアはありますか?

4

2 に答える 2

2

ここでの問題は、タイムスタンプ変数がない古いメソッドシグネチャを使用するタスクがキューに入れられていることです。いくつかの詳細情報がなければ、最善の行動方針を決定することは困難です。

現在、キューに入れられているタスクは非常に重要ですか?私の意見では、この問題を解決する最も簡単でクリーンな方法は、セロリを停止し、Redis / RabbitMQ /を介してキューを空にしてから、セロリを再起動することです。また、これは言うまでもなく、タスク関数が新しい引数をパラメーターとして受け入れることを確認してください;)

于 2013-03-27T13:39:38.007 に答える
1
  1. たとえばprocess_request_with_stime()、新しいタスクを追加し、古いタスクを保持し、process_request()の呼び出しを置き換えますweb()

  2. 配備

  3. タスクのすべての古いキューに入れられたジョブprocess_request()が処理された後、タスクを削除し、名前をprocess_request()に変更process_request_with_stime()しますprocess_request()

于 2017-12-01T06:54:32.790 に答える