我在Heroku上有一个Django应用程序,它使用Celery的延迟方法调用一个任务,该方法应该将额外的处理传递给一个worker.但是当我向相应的视图发出http请求时,Heroku web dyno会挂起并最终导致请求超时.这是一个测试任务(应用程序称为等待时间):
@task
def test_tasks(message, name='waittimes.tasks.test_tasks'):
print message
Run Code Online (Sandbox Code Playgroud)
而测试视图:
class TaskTest(View):
def get(self, request):
print "about to call the task"
test_tasks.delay("the task was successful!")
return HttpResponse("view was successful")
Run Code Online (Sandbox Code Playgroud)
如果我向这个视图发出http请求,我希望"任务成功"输出到控制台并回复说"视图成功".当我向计算机上的开发服务器发出请求时,这种情况会成功发生.如果我在我的应用程序的Heroku环境中启动django shell并使用django的测试客户端发出请求,它也可以工作.
app[celeryd.1]: [2013-06-26 23:57:48,018: INFO/MainProcess] Got task from broker: waittimes.tasks.test_tasks[67036069-b49e-45ba-aef4-3c64d7161a67]
app[celeryd.1]: [2013-06-26 23:57:48,133: WARNING/PoolWorker-3] the task was successful!
app[celeryd.1]: [2013-06-26 23:57:48,200: INFO/MainProcess] Task waittimes.tasks.test_tasks[67036069-b49e-45ba-aef4-3c64d7161a67] succeeded in 0.09690284729s: None
Run Code Online (Sandbox Code Playgroud)
但是当我直接向Heroku url发出请求时,请求会挂起,我最终会从Heroku获得一个可怕的H12超时错误.
heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/task/test/ dyno=web.1 connect=2ms service=30000ms status=503 bytes=0
Run Code Online (Sandbox Code Playgroud)
我知道调用该任务导致问题,因为"即将调用任务"确实打印在控制台中.所以问题是系统无法解析"延迟"(和apply_async)方法.它只是挂起并且不返回异步对象.这只有在代码在web dyno进程上运行时才会发生.
到目前为止,这些是我的结论:
1)任务正确注册并且我的Redis代理正在工作,因为当我使用shell中的测试客户端调用视图时一切正常(但是这是在Heroku上的单独shell进程上运行,而不是通常接收请求的web dyno ) …