我有一个简单的Django Celery任务,比如:
@task(name="upload_file_to_cdn", max_retries=10)
def upload_file_to_cdn(file_id):
stuff
当我通过 Django shell 启动它时:
./manage shell
from myapp.tasks import upload_file_to_cdn
upload_file_to_cdn.apply_async(args=(123,))
芹菜报告它立即运行:
tail -f /var/log/celeryd.log
[2014-01-02 22:54:18,694: INFO/MainProcess] Received task: tasks.upload_file_to_cdn[6e58b72b-8832-427d-a6b8-574f71ac9baa]
[2014-01-02 22:54:18,698: DEBUG/MainProcess] Task accepted: tasks.upload_file_to_cdn[6e58b72b-8832-427d-a6b8-574f71ac9baa] pid:5007
[2014-01-02 22:54:18,714: WARNING/Worker-1] Uploading file 123...
但是,当我从 Django 视图中upload_file_to_cdn.apply_async(args=(123,))
运行完全相同的行时,我在芹菜中看到的.log是:
[2014-01-02 22:47:04,006: INFO/MainProcess] Received task: tasks.upload_file_to_cdn[cb8be827-4604-4aa8-81b0-879657827e63] eta:[2014-01-03 03:47:19.004160-05:00]
如您所见,它不仅不会立即运行任务,还会在大约 6 小时后设置 ETA!这是为什么呢?
该问题最终是由安装在启动和执行任务的单独主机上的 django-celery/celery Python 包中的不同版本引起的。一个使用celery==3.1.7
而另一个使用celery==3.1.1
,这种差异足以触发行为。同步版本解决了问题。