当前位置: 首页 > 编程笔记 >

tornado+celery的简单使用详解

鲁辉
2023-03-14
本文向大家介绍tornado+celery的简单使用详解,包括了tornado+celery的简单使用详解的使用技巧和注意事项,需要的朋友参考一下

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的简单使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: class AsyncHandler(tornado.web.RequestHandler): 引发错误: 代理和后端都使用redis,我只是从https://github.com/mher/tornado- celery 复制而来 当我使用amqp代理和redis后端时,它可以很好地工作,但在使用redis代理时却不能。这是因为tornado异步不支持Redis代理吗? 问题答案:

  • 问题内容: 为了在Web上实时传输数据,我计划使用Redis作为我的Cache数据层,其中数据是瞬时的。Celery是队列管理器,RabbitMQ是从Redis排队进入Tornado层的代理。然后,该层通过websockets流到前端。 我从未在网上找到Redis + RabbitMQ组合。有人可以为它提供可靠的解决方案指南。问题是这样的整合是否可能和明智的? 问题答案: 我现在非常成功地一起使用

  • 问题内容: 由于没有人提供此帖子的解决方案,而且我非常需要解决方法,因此,这是我的处境以及一些抽象的解决方案/想法供讨论。 我的堆栈: 1. Tornado 2. Celery 3. MongoDB 4. Redis 5. Rabbit MQ 我的问题:找到一种方法让龙卷风派遣一个芹菜任务(解决),然后异步收集结果(有什么想法吗?)。 方案1 :(请求/响应hack加上webhook) 龙卷风收到

  • 本文向大家介绍详解webpack-dev-server的简单使用,包括了详解webpack-dev-server的简单使用的使用技巧和注意事项,需要的朋友参考一下 webpack-dev-server webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.

  • 本文向大家介绍详解log4j.properties的简单配置和使用,包括了详解log4j.properties的简单配置和使用的使用技巧和注意事项,需要的朋友参考一下 本文介绍了详解log4j.properties的简单配置和使用,分享给大家,具体如下: 简单log4j.properties配置示例 JAVA 代码部分 需要log4j JAR包 Log4j支持两种格式的配置文件:xml和prope

  • 本文向大家介绍使用Python的Tornado框架实现一个简单的WebQQ机器人,包括了使用Python的Tornado框架实现一个简单的WebQQ机器人的使用技巧和注意事项,需要的朋友参考一下 我打算将WebQQ单独出来运行, 一开始直接拷贝了pyxmpp2的mainloop, 但是跑起来问题多多, 所以我又研究了利用Tornado进行网络编程(这里), 所以我放弃了Pyxmpp2的mainlo