跳转到主要内容

未知

项目描述

Taskmaster

Taskmaster是一个简单的分布式队列,专为处理大量一次性任务而设计。

我们在DISQUS构建了这个工具来处理“将此数据迁移到新架构”等频繁但罕见的工作。

为什么?

您可能会问,“为什么不使用Celery?”好吧,答案很简单,常规队列需要(不是字面上的,但如果没有它会很痛苦)将所有任务缓冲到中央位置。当您有大量任务时,这成为一个问题,尤其是当这些任务包含大量数据时。

想象一下,您有10亿个任务,每个任务重量为5k。这至少需要4TB的存储空间来存储这些任务,而收益却很小。

另一方面,Taskmaster设计为接受可恢复的迭代器,并且一次最多拉入一定数量的工作(使用标准的Python Queue)。这确保了一种一致的内存模式,可以线性扩展。

要求

要求应该由setuptools处理,但如果它们没有,您将需要以下Python包

  • progressbar

  • pyzmq (zeromq)

  • gevent

  • gevent_zeromq

关于Gevent的说明

鉴于Taskmaster既用于其迭代器任务(主任务)也用于其消费者,您的应用程序需要正确实现非阻塞的gevent兼容调用者。在大多数情况下这不会成为问题,但如果您正在使用网络,您将需要寻找兼容您的适配器的库。例如,有一个为gevent设计的psycopg2的替代版本,称为gevent-psycopg2

用法

创建一个迭代器和回调

# taskmaster/example.py
def get_jobs(last=0):
    # last would be sent if state was resumed
    # from a previous run
    for i in xrange(last, 100000000):
        # jobs yielded must be serializeable with pickle
        yield i

def handle_job(i):
    # this **must** be idempotent, as resuming the process may execute a job
    # that had already been run
    print "Got %r!" % i

启动主任务

$ tm-master taskmaster.example

您还可以为主任务传递关键字参数

$ tm-master taskmaster.example argument=value

启动从任务

$ tm-slave taskmaster.example

或者创建8个奴隶(每个都包含一个线程池)

$ tm-spawn taskmaster.example 8

不喜欢主/从的魔法函数发现?指定您自己的目标

$ tm-master taskmaster.example:get_jobs
$ tm-slave taskmaster.example:handle_job

也许您只需要在同一服务器上运行东西?

$ tm-run taskmaster/example.py 8

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

taskmaster-0.8.2.tar.gz (8.0 kB 查看散列值)

上传时间

由以下支持