0

セロリについて質問です。task という名前の関数を呼び出しており、特定のクラスのリストを返したいと考えています。しかし、これを行うと、サーバーでエラーが発生します。

No module named 'modelsgert'

modelsgert は、クラスが定義されている python ファイルの名前です。サーバーにあるプロジェクトに同じファイルをインポートしましたが、彼はこれを知りません。おそらく彼は、セロリ サーバー上のファイルの場所への参照を送信します。

コード セロリ サーバー:

from celery import Celery
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from modelsgert import(
Diagnose,
Procedur,
DBSession,
Data
)
import time
celery = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')

@celery.task()
def test_task(data):
    diagnose = DBSession.query(Diagnose)
    listofdiagnoses = []
    listofdiagnoses.append(diagnose[0])
    listofdiagnoses.append(diagnose[1])
    return (listofdiagnoses)

コードピラミッドサーバー

celery = Celery( backend='amqp', broker='amqp://guest@192.168.1.5:5672//')
    celery.conf.update(CELERY_RESULT_BACKEND = 'amqp', BROKER_HOST='192.168.1.5', BROKER_USER='kristof', BROKER_PASSWORD='bob', BROKER_VHOST='myvhost', BROKER_PORT=5672)
    task = celery.send_task('tasks.test_task',["kakker"])
    TheData = task.get()

この問題を適切な方法で修正する方法はありますか?

4

1 に答える 1

1

modelsgertそのエラーが表示されたときに、それが利用可能であると確信していますか?

Celery はデフォルトで pickle を使用し、そのモジュールは実際にモジュールとクラスの名前を (クラスに含まれるデータと共に) 格納し、データを再度ロードすると、モジュールとクラスが動的に検索されます。modelsgertをインポートできないため、この段階は失敗します。

ここで SQLAlchemy オブジェクトを送信しようとしていることに注意する必要がありますが、それが良い考えであることはほとんどありません。オブジェクトは特定のセッションに関連付けられており、オブジェクトを unpickle すると、そのセッションは存在しなくなります。さらに、オブジェクトはデータベースの状態を表し、オブジェクトを再度ロードするまでにデータベースの状態は簡単に変更されている可能性があります。

代わりに、オブジェクト識別子を送信し、反対側でオブジェクトを再度クエリする必要があります。Diagnoseオブジェクトのリストの代わりに、主キーを送信します。

listofdiagnoses = [d.id for d in diagnose]

反対に、これらの識別子を使用Diagnoseして、データベースからオブジェクトを再度ロードします。

于 2013-05-14T09:59:20.557 に答える