下面我来为你详细讲解“tornado+celery的简单使用详解”的完整攻略。
概述
Tornado是一个使用Python语言编写的Web框架,它使用非阻塞的IO处理请求,高效稳定。而Celery是一个使用Python编写的分布式任务队列,在实现异步任务的同时保证高并发和可伸缩性。
将Tornado与Celery组合使用可以有效地提升Web应用的性能。本文将介绍如何在Tornado中集成Celery,以及如何使用Celery来处理异步任务。
安装
首先需要安装Celery
和tornado-celery
库。
pip install celery tornado-celery
配置
以下是一个Celery配置文件的例子(文件名为celeryconfig.py
):
BROKER_URL = 'redis://localhost:6379/0' # 指定消息代理的存储位置
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1' # 指定任务后续处理结果的存储位置
CELERY_TASK_SERIALIZER = 'json' # 任务序列化方式
CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方式
CELERY_ACCEPT_CONTENT = ['json'] # 允许接收的序列化方式
CELERY_IMPORTS = ( # 定义任务模块
'tasks',
)
以上方法的配置方式为redis
,当然你也可以使用其他方式,如RabbitMQ等。
接着在Tornado中配置Celery:
from tornado_celery import Celery
from celery import Celery as _Celery
celery_app = _Celery()
celery = Celery(celery_app=celery_app)
这里需要注意,两个Celery
命名空间不同,使用需要注意。
使用
首先定义一个任务:
from app import celery
@celery.task
def add(x, y):
return x + y
其中celery.task
是装饰器,将add
函数装饰成可以被Celery执行的任务。
然后在Tornado的RequestHandler中调用这个任务:
import tornado.ioloop
import tornado.web
from app import celery
class IndexHandler(tornado.web.RequestHandler):
def get(self):
result = celery.send_task('add', args=[1, 2]).get()
self.write('result: %s' % result)
if __name__ == '__main__':
app = tornado.web.Application([
('/', IndexHandler),
])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
以上代码中,我们使用celery.send_task
来发送任务,然后通过调用.get()
方法获取任务执行结果,最后将结果返回给客户端。注意,.get()
方法将会引起阻塞,可以使用.apply_async
方法来实现非阻塞调用。
示例
下面是一个示例任务:
from app import celery
@celery.task
def greet(name):
return 'Hello, %s!' % name
在RequestHandler中调用:
class AsyncHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
future = celery.send_task('greet', args=['Tornado'])
response = yield future
self.write(response.result)
这里使用了Tornado提供的异步处理方式,通过协程和yield
关键字来实现非阻塞调用。
以上就是使用Tornado和Celery进行异步任务处理的完整攻略。通过以上方法,可以将长时间运行的任务与Tornado分离,提高Web应用的性能和可伸缩性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tornado+celery的简单使用详解 - Python技术站