是否有可能在芹菜中返回一个班级列表?

时间:2013-05-14 09:50:55

标签: python python-3.x celery

我有一个关于芹菜的问题。 我正在调用一个名为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()

有没有办法以正确的方式解决这个问题?

1 个答案:

答案 0 :(得分:1)

当您看到错误时,您确定modelsgert可用吗?

Celery默认使用pickle,该模块确实存储了模块和类的名称(以及类中包含的数据),并且在再次加载数据时,模块和类被动态查找。此阶段失败,因为无法导入modelsgert

我必须注意到你正在尝试在这里发送SQLAlchemy对象,这很少是一个好主意。对象绑定到特定会话,当您取消对象时,会话将不再存在。移动,对象表示数据库状态,并且在您再次加载对象时,数据库状态可以轻松地更改

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

listofdiagnoses = [d.id for d in diagnose]

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