【问题标题】:Running a Celery task when unable to import that task无法导入该任务时运行 Celery 任务
【发布时间】:2011-12-19 18:42:32
【问题描述】:

我有两台服务器:一台运行 django 应用程序,一台运行 rabbitmq 队列和 celery worker。我在运行队列/worker 的服务器上的 tasks.py 包含如下任务:

@task(queue="reports")
def test_task():
    time.sleep(120)

我的目标是从 django 视图执行此任务。由于该任务的代码与我想调用该任务的 django 视图位于不同的服务器上,因此我尝试使用以下代码将任务从 django 发送到工作机器。

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue)

我找到了这个方法here,但到目前为止测试它还没有奏效。

我在 celery worker 服务器上的 celery worker 日志文件上使用 tail -F 进行测试,然后在浏览器中导航到包含 send_task 的视图的 url。我正在寻找在尾部输出中显示为“已收到”的任务,但它没有。

celery worker 的日志级别为 DEBUG,日志文件显示该任务已使用正确的名称注册,并且 django 应用程序的 settings.py 包含 rabbitmq 服务器的正确 IP 和凭据。在尝试不同的方法时,当我将传递给 send_task 的字符串更改为无效任务(即 send_task('asdf'))时,我偶尔会在 celery 日志文件中看到一条错误消息。这导致日志文件中出现 UnregisteredError。然而,这只是偶尔发生,而且到目前为止,在测试设置和调用的不同组合时,我还没有找到可靠地复制该行为的方法。

另外,这是 django 项目中 settings.py 的相关部分(删除了实际值):

CELERY_RESULT_BACKEND = 'amqp'
BROKER_HOST = 'the.correct.IP.address'
BROKER_USER = 'the_correct_user'
BROKER_PASSWORD = 'the_correct_pass'
BROKER_VHOST = 'the_correct_vhost'
BROKER_PORT = 5672

我用谷歌搜索了很多关于 send_task 的信息。关于我可能做错的任何想法?

【问题讨论】:

标签: python django rabbitmq celery amqp


【解决方案1】:

已解决,原来我传递给 send_task 的发布者关键字 arg 无效并引发错误。没有看到错误,因为我是 AJAX 请求页面而不是直接导航到它。关于这种情况的其他一切都是正确的。我还删除了传递给 send_task 的不必要的关键字 args 和 args。

send_task("tasks.test_task", task_id=task_id, queue=queue)

【讨论】:

    【解决方案2】:

    [我以为你]试图做的事情是不可能的。 Celery 工作人员需要访问他们要运行的任务代码。没有办法。

    修订:

    但你真正想做的是:让工作人员可以使用代码,但不能让 Django 视图使用,它应该只按名称引用任务。

    【讨论】:

    • 你说芹菜工人需要他们将运行的代码是绝对正确的,但我认为你误解了原帖的一部分。需要明确的是,工作人员上面有任务代码 - 这是我希望远程执行的任务的调用。所以django视图告诉worker运行任务。
    猜你喜欢
    • 2021-04-26
    • 2014-12-26
    • 2016-08-13
    • 2011-09-15
    • 2015-10-24
    • 2012-08-26
    • 2022-11-14
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多