草庐IT

django - Celery 任务似乎可以完成除写入数据库之外的所有操作

coder 2023-10-31 原文

我将 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/

有关django - Celery 任务似乎可以完成除写入数据库之外的所有操作的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  5. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  6. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  7. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  8. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  9. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  10. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

随机推荐