从另一个芹菜任务调用芹菜任务

时间:2013-08-12 19:33:06

标签: django celery

我有一个名为send_async_fax的芹菜任务,另一个叫send_notificationssend_async_fax可以直接调用。但是,如果您拨打send_notifications,也会调用send_async_fax

send_async_fax有许多参数,其中一个是file个对象的列表。如果我直接拨打send_async_fax,一切似乎都按计划进行。但是,当通过send_notifications间接调用它时,我发现有效打开文件列表会降级为未初始化文件列表。

我的预感是send_notifications实际上是在调用send_async_fax.delay时创建单独的异步任务来发送传真(当然,这是有道理的)。但是,通过执行此操作,我怀疑文件引用已搞砸,或send_notifications正在关闭文件,send_async_fax实际上对它们进行操作。

为了测试这种预感,我尝试在send_async_fax中调用send_notifications而不使用delay函数(即send_async_fax(* args)而不是send_async_fax.delay(* args))。这并没有改变任何事情。然后,我为task注释了send_async_fax装饰器,使其成为常规功能。在这种情况下,一切都按预期工作。

因此,为了实现这一点,显而易见的解决方案是在从芹菜任务调用时,制作我的传真功能的同步版本并使用它而不是异步版本。但是,我希望有一种比这更优雅的解决方案。谢谢你的帮助。

  • 芹菜== 3.0.19
  • Django的芹菜== 3.0.17

1 个答案:

答案 0 :(得分:0)

我敢打赌它与尝试将打开的文件序列化为延迟任务的参数有关。

尝试将fullpath文件名作为输入参数发送到send_async_fax函数并打开send_async_fax中的文件。

我在这里举了一个叫做另一个任务的例子:

https://github.com/brentpayne/django-celery-example/blob/master/polls/tasks.py

https://github.com/brentpayne/django-celery-example/blob/master/polls/management/commands/one_task_calls_another.py

但你可能想要做更多的事情:

group(send_async_fax.map(my_list_to_fax))。delay()