tornado+celery的简单使用详解


Posted in Python onDecember 21, 2019

celery是实现一个简单,灵活可靠的分布式任务队列系统的好选择

tornado则不用过多介绍

在开发机上安装rabbitmq这里就不介绍了

首先是task文件的编写

task.py

#coding=utf-8
from celery import Celery
from celery.bin import worker as celery_worker
import celeryconfig

broker = 'amqp://'
backend = 'amqp'
app = Celery('celery_test', backend=backend, broker=broker)
app.config_from_object(celeryconfig)

@app.task
def mytask0(task_name):
  print "task0:%s" %task_name
  return task_name 

@app.task
def mytask1(task_name):
  print "task1:%s" %task_name
  return task_name 

def worker_start():
  worker = celery_worker.worker(app=app)
  worker.run(broker=broker, concurrency=4,
        traceback=False, loglevel='INFO')

if __name__ == "__main__":
  worker_start()

celeryconfig.py文件中包含对celery的配置

#coding=utf-8
from kombu import Queue
CELERY_DEFAULT_QUEUE = 'mytask0'
CELERY_QUEUES = (
  Queue('mytask0',  routing_key='task.mytask0'),
  Queue('mytask1',  routing_key='task.mytask1'),
)
CELERY_DEFAULT_EXCHANGE_TYPE = 'direct'
CELERY_DEFAULT_ROUTING_KEY = 'task.mytask0'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ROUTES = {
  'task.mytask0': {
    'queue': 'mytask0',
    'routing_key': 'task.mytask0',
  },
  'task.mytask1': {
    'queue': 'mytask1',
    'routing_key': 'task.mytask1',
  },
}

执行python task.py将会启动worker

tornado调用celery将阻塞任务变为非阻塞

这会使用到tcelery模块,即tornado下的一个非阻塞的broker实现

app.py

#coding=utf-8
from tornado import web
import task

class TestHandler(tornado.web.RequestHandler):

  @web.asynchronous
  def get(self):
    task.mytask0.apply_async(
      args=['task0'],
         queue='mytask0',
         routing_key='task.mytask0',
         callback=self.on_success)
  def on_success(self, result):
    self.finish({'task':result.result})

start.py

用于实现tornado服务的启动

#coding=utf-8
import tornado
from tornado.options import define, options, parse_command_line
from tornado.log import enable_pretty_logging
import tcelery
from app import TestHandler
import tornado.httpserver

define("port", default=8000, help="run on the given port", type=int)
define("debug", default=False, help="run in debug mode")

urls = [(r"/api/task/test", TestHandler)]

def server_start():
  app = tornado.web.Application(urls, debug=options.debug)
  enable_pretty_logging()
  parse_command_line()
  server = tornado.httpserver.HTTPServer(app)
  server.bind(options.port)
  server.start(2)
  tcelery.setup_nonblocking_producer(limit=2)
  tornado.ioloop.IOLoop.current().start()

if __name__ == "__main__":
  server_start()

执行python start.py即可启动服务

以上这篇tornado+celery的简单使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中mechanize库的简单使用示例
Jan 10 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
pyenv命令管理多个Python版本
Mar 26 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
python中append函数用法讲解
Dec 11 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 Python
Python selenium的基本使用方法分析
Dec 21 #Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 #Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 #Python
python支持多线程的爬虫实例
Dec 21 #Python
Python 实现try重新执行
Dec 21 #Python
在python shell中运行python文件的实现
Dec 21 #Python
Python 脚本的三种执行方式小结
Dec 21 #Python
You might like
PHP Web木马扫描器代码分享
2015/09/06 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
Python实现多线程下载文件的代码实例
2014/06/01 Python
线程和进程的区别及Python代码实例
2015/02/04 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python 26进制计算实现方法
2015/05/28 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
餐饮业创业计划书范文
2014/01/06 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
Python类方法总结讲解
2021/07/26 Python
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS