2011-12-19 96 views
6

我有两台服务器:一个运行的Django应用程序和一个同时运行一个RabbitMQ的队列和芹菜工人。我的运行队列/工人在服务器上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,但到目前为止测试它没有奏效。

我与芹菜工人服务器上的芹菜工人日志文件尾部-F测试,然后导航到包含在浏览器send_task视图的URL。我正在寻找在尾部输出中显示为“已收到”的任务,但事实并非如此。

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

此外,这是settings.py对Django项目的相关部分(与实际值去掉):

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。关于我可能做错什么的想法?

+0

我很想知道如何在两台机器之间共享代码。这里是我写的相关问题:http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server谢谢! – lajarre 2015-02-19 15:30:02

回答

7

解决了,原来出版商关键字ARG我被传递到send_task是无效的,并抛出一个错误。没有看到错误,因为我是AJAX--请求页面而不是直接导航到页面。关于这种情况的一切都是正确的。我还删除了传递给send_task的不必要的关键字args和args。

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

什么[我还以为你]试图做是不可能的。芹菜工人需要访问他们要运行的任务代码。这是没有办法的。

修订:

但你真的想要做的是:有Django的视图,它应该只按名称引用任务提供给工人,但不是代码。

+0

你绝对正确,芹菜工人需要他们将运行的代码,但我认为你误解了原始帖子的一部分。要清楚的是,工作人员上面有任务代码 - 这是我想要远程执行的任务*调用。所以django视图告诉工作者运行任务。 – 2011-12-20 04:52:24

+0

修订修订! – dkamins 2011-12-20 07:37:37