我一直在做一个项目,该项目使用Celery beat来调度任务。在本地,我一直使用RabbitMQ作为代理,一切都很好。
当我将我的项目推送到远程服务器时,我将代理更改为Redis。
celery beat
进程可以很好地工作,正如我在控制台中看到的那样,它正在调度任务。但是这个工人无法完成任务。当我通过在任务上使用delay()从shell异步调用任务时,即使在那时,该任务也不会被工作人员接收。
我以为Redis可能有什么奇怪的地方。然而,情况似乎并非如此。我让我的项目在本地使用Redis。在服务器上,当我将代理更改为RabbitMQ时,即使在那时我也遇到了同样的问题。
我的本地机器运行Mac操作系统,服务器运行Debian 6。
可能是什么问题?我如何调试这种情况,让工作人员使用任务并完成工作?我使用的是Python 2.7。
我发现了这个问题,结果发现它真的很愚蠢,这表明我做了一个糟糕的练习。
我使用Gevent来衡量服务器上的性能差异,而我生成Celery工作程序的方式不是处理Gevent代码的正确方式。并不是说我不知道Celery在Gevent的命令行参数中需要一个标志,在本地机器上不使用相同的代码对我来说总是有效的。只是我从来没有想过我在使用Gevent,这就是问题的原因。
经过近20个小时的调试、谷歌搜索和IRC聊天,所有问题都得到了解决。