Python:不同特定工作人员的分布式任务队列

mrs*_*spl 5 python distributed task-queue

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

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

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

Rob*_*ara 5

这听起来非常适合Ray,它是一个用于并行和分布式 Python 的库。您可以使用Ray 演员来创建“专业工人”。这是一个示例,其中包含由 classesWorkerType1WorkerType2.

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, ...].
Run Code Online (Sandbox Code Playgroud)

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

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

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


Mar*_*nek 2

我认为你需要的不是一个Python库,而是一个适当的队列服务,它作为一个完全独立于Python工作人员的单元进行配置和管理。这样,您不需要编写自己的公共库(这将是所有工作人员的公共依赖项),但可以重用现有的包进行队列订阅。

我真的推荐这个资源来帮助您实现您想要实现的目标并介绍要查找的术语: https: //github.com/donnemartin/system-design-primer#message-queues

我链接到消息队列部分,其中列出了您可以探索的几个选项:

  • Redis - 这实际上是您提议的 - 请注意,Redis 不是持久性的,您未完成的任务可能会丢失。
  • RabbitMQ - 我个人推荐这个,因为它使用AMQP协议并且拥有庞大的社区。
  • Amazon SQS - 如果您使用 AWS,该服务的优点是在 PaaS 模型中进行管理。

当然,队列可以用来将任务作为消息分发。

此外,如果您正在构建高度异步的系统,您可以探索事件溯源模式,因为它塑造了您的整个架构,以使用消息队列或流服务来传播事件。如果您想走这条路,那么为工作选择合适的服务非常重要。