- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我将 Django 与 MongoEngine、django-celery 和用于 celery 的 MongoDB 后端一起使用。我正在排队一项任务。该任务涉及从 GridFS(通过 MongoEngine FileField)获取文件,对其进行操作并将其放回数据库中。
任务按预期运行,没有排队。当我对它进行排队时,它会转换文件,但不会写入数据库。
这是我的 settings.py 的相关部分。
#These are apparently defaults that I shouldn't need
BROKER_BACKEND = 'mongodb'
BROKER_HOST = "localhost"
BROKER_PORT = 27017
BROKER_USER = ""
BROKER_PASSWORD = ""
BROKER_VHOST = ""
CELERY_RESULT_BACKEND = "mongodb" CELERY_MONGODB_BACKEND_SETTINGS = {
"host": "localhost",
"port": 27017,
"database": "svg",
"taskmeta_collection": "taskmeta", }
import djcelery djcelery.setup_loader()
我正在像这样运行 celery
$ ./manage.py celeryd -l info
当它运行任务时,celery 会这样说
[2011-07-23 16:07:11,858: INFO/MainProcess] Got task from broker: graphics.tasks.queue_convert[dfdf98ad-0669-4027-866d-c64971bb6480]
[2011-07-23 16:07:15,196: INFO/MainProcess] Task graphics.tasks.queue_convert[dfdf98ad-0669-4027-866d-c64971bb6480] succeeded in 3.33006596565s
(没有错误)
这是任务。
@task()
def queue_convert(imageId):
image=Image.objects.get(id=imageId)
convert(image)
convert 调用了一堆其他函数。基本上,它首先从 FileField 中读取,操作该字符串,将该字符串写入文件,操作该文件,将生成的字符串和文件写入其他 FileField,然后运行 image.save()。
根据我是否对任务进行排队,mongo 日志看起来会有所不同。这就是我使用任务队列时 mongo 日志中发生的情况。
Sat Jul 23 16:03:26 [initandlisten] connection accepted from 127.0.0.1:39065 #801
Sat Jul 23 16:03:26 [initandlisten] connection accepted from 127.0.0.1:39066 #802
Sat Jul 23 16:03:29 [initandlisten] connection accepted from 127.0.0.1:39068 #803
这是当我直接调用 convert(image) 而不是调用 queue_convert(image.id) 时发生的情况
Sat Jul 23 16:07:13 [conn807] end connection 127.0.0.1:43630
Sat Jul 23 16:07:13 [initandlisten] connection accepted from 127.0.0.1:43633 #808
Sat Jul 23 16:07:13 [initandlisten] connection accepted from 127.0.0.1:43634 #809
Sat Jul 23 16:07:13 [conn808] end connection 127.0.0.1:43633
知道哪里出了问题吗?
最佳答案
更新:我对你遇到的问题进行了更多思考,虽然听起来你已经为你解决了,但我会添加一些注释以防有人遇到类似问题。
Mongodb 显式扩展了 JSON,改为使用“BSON”,它将二进制和文件类型添加到支持的类型列表中。我只在 celery 文档中看到过“JSON”,所以我猜想将 mongodb 与 celery 一起使用并处理扩展集需要小心,因为这听起来像是在处理图像。
在最新开发版本的 IPython (11.0rc4) 的文档中,他们讨论了他们的分布式工作系统。尽管行话听起来与 celery 相似,但后端可能大不相同。我认为 celery 在后端方面相对灵活,并且可能允许更多的安全性,这听起来像是 ipython 需要的 zeromq 的问题。但在数据库方面,根据文档,ipython 系统是“围绕 mongodb 从头开始设计的”,并且完全支持 bson。因此,如果您不太关心其他 celery 功能(安全性、与 django 相关的开发基础,当然还有更多),您可以研究一下。同样,这绝不是 celery 和 ipython 都应得的严格评价,只是可能的领先优势; ipython 还与其他科学计算库很好地集成,内置了对 matplotlib 的支持,以及许多科学计算示例,如果您正在进行图像处理并将图像数据视为 numpy 数组或其他任何东西,您可能会感兴趣。
祝你好运
原答案:我同意 lazerscience - 在这里有更多的背景信息会有所帮助。由于这些库的复杂性,有很多未知数。可能无法以本网站预期的严谨性回答。
也就是说,我认为您可能遇到了序列化问题。 Celery 要求您的对象是可腌制的,或者至少可以根据您选择的任何实现进行序列化(我知道它们也支持 JSON,尽管我是一个新手,无法确定 Pickle 和 JSON 是否完全重叠)。我看到你的函数只接受一个整数参数,这很好。但是转向 gridfs 是否意味着您正在尝试 pickle 图像?你当然可以用 celery 操作图像,但我不确定,尤其是在神秘的“转换”函数背后发生的一切,你是否可能不小心尝试序列化 unicode、字典、整数、 float 等以外的东西您的格式将支持的其他一些杂项对象。也许您过去曾检索过图像的文件路径并在文件中对其进行操作,而无需检索或发送超过 unicode 的内容,而现在有了图像本身?
如果我离题太远,请让我放松一点。我回复是因为我在这里和 mongoengine 用户组上都看到了你的消息,我认为你被困住了,没有找到更专业的意见。您还可以仔细检查以确保您拥有合理最新版本的后端软件。我在某些时候遇到了一堆奇怪的 celery 问题,发现它们主要在我更新 rabbitmq 时得到解决。祝你好运!
关于django - Celery 任务似乎可以完成除写入数据库之外的所有操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6803332/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!