首页 > 解决方案 > Python:针对不同特定工作人员的分布式任务队列

问题描述

我正在寻找一个管理任务分配(例如任务队列)的python 库/框架。但是,任务将需要专门的工人:工人 A 只能处理类型的任务a,工人 B 和 C 只能处理类型b等。此外,这些工人将在不同的计算机上运行并且不能共享相同的代码库(因为,就像在生产线上,每个任务都必须控制特定的硬件,只有一台计算机可以访问)。

我看过 python RQ或 Celery 之类的库,但如果我理解正确的话,它们需要相同的代码库才能在不同的工作人员上运行,并且用于分布式计算。我正在寻找的基本上只是抽象任务队列的管理和工作人员可以通过网络获取任务的机制。一个任务基本上只是一些关于它的进度、错误、结果等的数据和元信息。如果任务也可以相互依赖,那么一个任务可以依赖于另一个任务的结果。

是否有一个简单的库,负责管理队列、网络协议等,提供我正在寻找的东西?

标签: pythondistributedtask-queue

解决方案


这听起来很适合Ray,它是一个并行和分布式 Python 的库。您可以使用Ray actor创建“专业工作者”。这是一个由类WorkerType1WorkerType2.

import ray


@ray.remote
class WorkerType1(object):
    def method1(self):
        # Do some interesting work.
        return 1


@ray.remote
class WorkerType2(object):
    def method2(self):
        # Do some interesting work.
        return 2


if __name__ == "__main__":
    ray.init()

    # Create one worker of each type.
    worker_1 = WorkerType1.remote()
    worker_2 = WorkerType2.remote()

    # Kick off 100 tasks for each worker.
    result_ids = []
    for _ in range(100):
        result_ids.append(worker_1.method1.remote())
        result_ids.append(worker_2.method2.remote())

    # Retrieve the results.
    results = ray.get(result_ids)  # This is [1, 2, 1, 2, ...].

您当然可以创建每种类型的工人池。工作人员还可以拥有任务变异的状态,可以有多种不同的方法,等等。您可以在Ray 文档中阅读更多内容。

请注意,要在集群而不是单机上运行上述示例,您需要修改该ray.init()行以传入集群地址。

请注意,我是 Ray 开发人员之一。


推荐阅读