我有一个关于芹菜的问题。 我正在调用一个名为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()
有没有办法以正确的方式解决这个问题?
答案 0 :(得分:1)
当您看到错误时,您确定modelsgert
可用吗?
Celery默认使用pickle,该模块确实存储了模块和类的名称(以及类中包含的数据),并且在再次加载数据时,模块和类被动态查找。此阶段失败,因为无法导入modelsgert
。
我必须注意到你正在尝试在这里发送SQLAlchemy对象,这很少是一个好主意。对象绑定到特定会话,当您取消对象时,会话将不再存在。移动,对象表示数据库状态,并且在您再次加载对象时,数据库状态可以轻松地更改。
您应该发送对象标识符,并在另一侧再次查询对象。而不是Diagnose
个对象的列表,而是发送主键:
listofdiagnoses = [d.id for d in diagnose]
另一方面,您可以使用这些标识符从数据库中再次加载Diagnose
个对象。