我正在将我的 celery worker 从 celery v3 更新到 celery v4,我的所有任务都是基于类的任务。 I have manually registered the tasks因为这是升级文档中的指示。
问题出在任务路由中,我有以下任务:
class RegisterTask(Task):
routing_key = 'app_server.register'
def run(**params):
whatever ...
我正在运行两个 celery worker,一个在默认队列中,另一个在注册队列中,如下所示:
# Default Worker
celery -A app_server worker --loglevel=info --concurrency=1
# Register Worker
celery -A app_server worker -Q app_server_register --loglevel=info --concurrency=1
这是我的队列定义:
CELERY_TASK_DEFAULT_QUEUE = 'app_server_default'
CELERY_TASK_DEFAULT_ROUTING_KEY = 'app_server.default'
CELERY_TASK_QUEUES = (
Queue('app_server_default', routing_key='app_server.default'),
Queue('app_server_register', routing_key='app_server.register')
)
意外行为是我在使用 Celery V3 和 Celery V4 调用任务时看到的差异。
# Celery V3
RegisterTask().delay(**params)
# task is consumed by the register worker!
# Celery V4
RegisterTask().delay(**params)
# task is consumed by the default worker!
而且我希望任务由register worker 使用(celery v3 行为),因此我在基于类的任务中硬编码了 routing_key 属性。但是 Celery V4 似乎忽略了基于类的任务中的 routing_key 属性。
[我也在使用 redis 作为代理,如果它有任何重要的话]
关于这个问题有什么想法吗?
谢谢!
最佳答案
routing_key 作为类属性在 v4 中已弃用。
您可以将其提供给调用时的任务
apply_async 的 kwarg 或者您可以手动将路由任务类型配置为 celery 配置中的队列。
查看docs
celery.task.base.Task 中的 Task 类已被 celery.app.task.Task 弃用。
这是一项设计更改,其中新任务类更喜欢在使用任务时而不是在实例化时绑定(bind)配置。 参见 this comment
查看源代码,您可以看到 routing_key 是在使用 _get_exec_options 绑定(bind)任务时设置的。 Here选项是使用实例 (self) 而不是类来设置的。
我通过查看 celery 源代码收集了这些信息,但如果文档中没有提及弃用,我想它们已经过时了。
也许在他们的 github 上填写问题并使用新范例中提供的选项之一是 future 的最佳选择。
Also there's in the doc that tasks routing_key will be read from task metadata, so class based tasks can't have this metadata anymore?
正确,元数据不再位于类对象上。它是通过配置设置的,或者在调用时通过任务实例延迟设置。
配置文件应该是静态路由的转到,而任务调用上的设置应该用于覆盖配置的默认值。
关于python - Celery v4 没有按预期路由任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54849446/
我试图在一个项目中使用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时
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
如何使用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
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle