1

我有一个叫做 celery 的任务send_async_fax,另一个叫做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_notifications文件之前关闭了文件。send_async_fax

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

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

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

1 回答 1

0

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

尝试将完整路径文件名作为输入参数发送到 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()
于 2013-08-28T05:48:09.750 回答