【问题标题】:Calling a celery task from another celery task从另一个 celery 任务调用一个 celery 任务
【发布时间】:2013-08-12 19:33:05
【问题描述】:

我有一个名为 send_async_fax 的 celery 任务和另一个名为 send_notifications 的任务。 send_async_fax 可以直接调用。但是,如果你调用send_notificationssend_async_fax 也会被调用。

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

我的直觉是 send_notifications 实际上是在调用 send_async_fax.delay 时创建单独的异步任务来发送传真(当然,这是有道理的)。但是,通过这样做,我怀疑文件引用被弄乱了,或者send_notificationssend_async_fax 实际开始操作文件之前关闭了文件。

为了测试这种预感,我尝试在 send_notifications 中调用 send_async_fax 而不使用 delay 函数(即 send_async_fax(*args) 而不是 send_async_fax.delay(*args))。那并没有改变什么。然后,我将send_async_faxtask 装饰器注释掉,使其成为常规函数。在这种情况下,一切都按预期进行。

因此,要使其正常工作,显而易见的解决方案是制作我的传真功能的同步版本,并在从 celery 任务调用时使用它,而不是异步版本。但是,我希望有比这更优雅的解决方案。感谢您的帮助。

  • 芹菜==3.0.19
  • django-celery==3.0.17

【问题讨论】:

    标签: django celery


    【解决方案1】:

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

    尝试将完整路径文件名作为输入参数发送到 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()
    

    【讨论】:

      猜你喜欢
      • 2018-01-20
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2012-08-13
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多