基于tornado和redis的web钩子任务队列
torque的Python项目详细描述
概述
torque是一个基于Tornado和redis的web钩子任务队列。它被设计成 在Web应用程序的上下文中解决两个问题:
- 你以后想做点什么
- 你想同时做很多事情
解决这些问题有很多方法。例如,在python中,您 可以看看Twisted、Celery和Stackless。
torque的灵感来自google app engine的taskqueue,它的models任务是 webhooks。这种方法允许您在正常的web中处理任务 通过编写请求处理程序实现的应用程序环境,就像处理 用户发起的请求。
要使用它,您需要运行:
或者,如果您只是使用默认队列,则可以将./bin/torque-serve和./bin/torque-process替换为:
- ./bin/torque-run
它在单独的线程中运行web应用程序和进程循环。
您可以无限期地处理队列,或者直到队列为空。见 torque.process.QueueProcessor.__doc__了解详细信息。
您可以通过两种方式将任务添加到队列:
- 通过向由./bin/torque-serve 运行的Tornado应用程序发送http请求
- 或者在torque.client 中使用python客户机api
第一种方法允许您使用来自任何编程语言的torque。第二次 如果您使用python,它会简单得多。
若要使用http请求添加任务,请使用两个参数投递到/add_task:
- url这是您希望任务请求的webhook的url
- params这是您想要的参数的json编码字典 发送到您请求的webhook
python中的一个示例(在localhost上提供了tornado应用程序, 在端口8889上运行将是:
import json import urllib mytask = { 'url': 'http://mywebservice.com/hooks/do/foo', 'params': json.dumps({'foo', 'somevalue', 'baz': 99}) } target_url = 'http://localhost:8889/add_task' urllib.urlopen(target_url, urllib.urlencode(mytask))
这将对http://mywebservice.com/hooks/do/foo的post请求排队 尽快生成参数foo=somevalue和baz=99。
您可以使用任何可以生成url的编程语言执行类似的操作 请求。但是,如果您使用的是python,那么使用客户机要简单得多 扭矩提供的API:
from torque.client import add_task t = add_task(url='http://mywebservice.com/hooks/do/foo', params={'a': 1})
注意,这不需要json对参数进行编码。对于所有客户端api 选项,请参见torque.client.Task.__doc__。
如果错误,个别任务退避,达到最大退避延迟。 这可以配置为--max_task_delay,直到它们出错为止--max_task_errors 时间(此时它们被删除)。
安装
$ easy_install torque
或手动从源代码:
$ git clone git://github.com/thruflo/torque.git $ cd torque $ python setup.py install
运行
运行redis:
$ ./redis-server
启动Tornado应用程序:
$ ./bin/torque-serve
如果要运行测试,请使用:
$ ./bin/nosetests -w ./src/torque --with-doctest ....... ---------------------------------------------------------------------- Ran 7 tests in 22.627s OK
启动默认任务队列,无限期运行:
$ ./bin/torque-process
有关配置列表,请参见针对任一torque控制台脚本的--help。 选项。例如,要运行名为foobar的第二个队列,可以使用:
./bin/torque-process --queue_name=foobar
或者要处理默认队列一次,直到为空,您可以使用:
./bin/torque-process --finish_on_empty=true --max_task_errors=3
或者从python代码中执行完全相同的操作:
from torque.processor import QueueProcessor QueueProcessor(max_task_errors=3).process(finish_on_empty=true)
阅读源代码了解更多信息。