【发布时间】:2013-08-12 19:33:05
【问题描述】:
我有一个名为 send_async_fax 的 celery 任务和另一个名为 send_notifications 的任务。 send_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_notifications 中调用 send_async_fax 而不使用 delay 函数(即 send_async_fax(*args) 而不是 send_async_fax.delay(*args))。那并没有改变什么。然后,我将send_async_fax 的task 装饰器注释掉,使其成为常规函数。在这种情况下,一切都按预期进行。
因此,要使其正常工作,显而易见的解决方案是制作我的传真功能的同步版本,并在从 celery 任务调用时使用它,而不是异步版本。但是,我希望有比这更优雅的解决方案。感谢您的帮助。
- 芹菜==3.0.19
- django-celery==3.0.17
【问题讨论】: