Python分布式任务队列适用于不同的特定工作者

2024-05-19 03:38:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我在找一个简单的网络管理协议?在


Tags: 代码网络框架类型硬件队列计算机错误
2条回答

这听起来非常适合Ray,它是一个并行和分布式Python库。您可以使用Ray actors创建“专业工人”。下面是一个由类WorkerType1WorkerType2表示的多个类型的worker的示例。在

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 documentation中阅读更多内容。在

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

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

我认为,您需要的不是python库,而是一个适当的队列服务,它作为一个单元进行配置和管理,与python worker完全分离。这样,您就不需要编写自己的公共库,这些库将成为所有worker的公共依赖项,但是可以重用现有的包来进行队列订阅。在

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

我链接到“消息队列”部分,其中列出了几个可以浏览的选项:

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

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

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

相关问题 更多 >

    热门问题