0

我有一个关于芹菜的问题。我正在调用一个名为 task 的函数,我想返回一个特定类的列表。但如果我这样做,我的服务器上会出现错误:

No module named 'modelsgert'

modelsgert 是定义了我的类的 python 文件的名称。我已将相同的文件导入到位于我的服务器上的项目中,但他不知道这一点。可能他发送了对 celery 服务器上文件位置的引用。

代码芹菜服务器:

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 对象,这很少是一个好主意。这些对象与特定会话相关联,当您取消选中对象时,该会话将不再存在。此外,对象代表数据库状态,当您再次加载对象时,数据库状态很容易发生变化

相反,您应该发送对象标识符,并在另一端再次查询对象。而不是对象列表,而是Diagnose发送主键:

listofdiagnoses = [d.id for d in diagnose]

另一方面,您将使用这些标识符Diagnose再次从数据库中加载您的对象。

于 2013-05-14T09:59:20.557 回答